我的目标是使用StatefulSet中的volumeClaimsTemplate在卷内部创建的每个Pod的文件夹(pod名称)。
一个例子是:
我正在努力让副本为自己创建新文件夹。对此的任何帮助将不胜感激。
答案 0 :(得分:1)
volumeClaimTemplates
是允许豆荚声明的清单 参考。 StatefulSet控制器负责映射 声明的网络身份以维持身份的方式 荚。此列表中的每个声明都必须至少有一个匹配项( 名称)volumeMount安装在模板的一个容器中。对此的主张 list优先于模板中的任何卷,并且相同 名称。
这意味着您可以使用volumeClaimTemplates
动态地从存储类中请求PVC。
如果我们以这个yaml
为例:
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
一旦部署了Pod,您会注意到正在创建Pod,并在创建过程中请求PVC
。 PVC
是以下约定的名称:
volumeClaimTemplate
名称+ Pod-name
+ Ordinal-number
因此,如果以yaml以上为例,您将收到三个PVC(假设有3个副本):
NAME STATUS VOLUME
www-web-0 Bound pvc-12d77135...
www-web-1 Bound pvc-08724947...
www-web-2 Bound pvc-50ac9f96
值得一提的是,Persistent Volume Claims
代表特定Pod对持久卷的专有使用。
这意味着,如果我们逐个查看卷,则会发现每个卷都分配给特定的pod:
➜ ~ pwd
/tmp/hostpath-provisioner/pvc-08724947...
➜ ~ ls
web-1
➜ ~ pwd
/tmp/hostpath-provisioner/pvc-50ac9f96...
➜ ~ ls
web-2
在测试时,我确实达到了您的目标,但是我不得不手动创建persistentvolumes
,他们必须指向相同的本地路径:
local:
path: /home/docker/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- minikube
与subPathExpr
结合使用,将以Pod命名的目录安装到指定路径中。
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
subPathExpr: $(NAME)
env:
- name: NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
结果(web
是部署的名称)
➜ ~ pwd
/home/docker/data
➜ ~ pwd
web-0 web-1 web-2
这里有subpath with expanded env variables的工作方式的详细信息。
使用
subPathExpr
字段从Downward API环境变量构造subPath
目录名。此功能需要启用VolumeSubpathEnvExpansion
feature gate。从Kubernetes 1.15开始默认启用它。subPath
和subPathExpr
属性是互斥的。
如果您有任何疑问,请告诉我。