volumeClaimTemplates 是允许 Pod 的声明列表
参考。 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 对 Persistent Volume 的独占使用。
这意味着,如果我们单独查看卷,我们会发现每个卷都分配给特定的 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 属性是互斥的。
如果您有任何问题,请告诉我。