![](/img/trans.png)
[英]Dynamic provisioning of Cinder volume and Persistent volume using Terraform through Kubernetes
[英]Dynamic volume provisioning folder per pod in a volume?
我的目标是使用 StatefulSet 中的 volumeClaimsTemplate 在卷内创建的每个 pod 的文件夹(pod 名称)。
一个例子是:
我正在努力让副本为自己创建新文件夹。 任何有关如何做到这一点的帮助将不胜感激。
volumeClaimTemplates
是允许 pod 引用的声明列表。 StatefulSet controller 负责以维护 Pod 身份的方式将网络身份映射到声明。 此列表中的每个声明必须在模板的一个容器中至少有一个匹配的(按名称)volumeMount。 此列表中的声明优先于模板中具有相同名称的任何卷。
这意味着使用volumeClaimTemplates
您可以动态地从存储 class 请求 PVC。
如果我们以这个yaml
为例:
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
部署 pod 后,您会注意到正在创建 pod,并且在创建过程中请求了PVC
。 PVC
是以下约定中的名称:
volumeClaimTemplate
name + 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
这里有更多信息,扩展环境变量的子路径是如何工作的。
使用
subPathExpr
字段从 Downward API 环境变量构造subPath
目录名称。 此功能需要启用VolumeSubpathEnvExpansion
功能门。 它从 Kubernetes 1.15 开始默认启用。subPath
和subPathExpr
属性是互斥的。
如果您有任何问题,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.