![](/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.