卷中每个 pod 的动态卷配置文件夹?

Dynamic volume provisioning folder per pod in a volume?

我的目标是使用 StatefulSet 中的 volumeClaimsTemplate 在卷内为每个 pod 创建一个文件夹(pod 名称)。

例如:

我正在努力让副本为自己创建新文件夹。任何有关如何执行此操作的帮助将不胜感激。

volumeClaimTemplates is a list of claims that pods are allowed to reference. The StatefulSet controller is responsible for mapping network identities to claims in a way that maintains the identity of a pod. Every claim in this list must have at least one matching (by name) volumeMount in one container in the template. A claim in this list takes precedence over any volumes in the template, with the same name.

这意味着使用 volumeClaimTemplates 您可以动态地从存储 class 请求 PVC。

如果我们以这个yaml为例:

volumeClaimTemplates: 
  - metadata: 
      name: www
    spec: 
      accessModes: ["ReadWriteOnce"]
      storageClassName: "standard"
      resources: 
        requests: 
          storage: 1Gi
      

部署 pods 后,您会注意到正在创建 pods,并且在创建过程中请求了 PVCPVC 是以下约定中的名称:

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 结合将以 pods 命名的目录安装到指定路径中。

    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 工作原理的信息。

Use the subPathExpr field to construct subPath directory names from Downward API environment variables. This feature requires the VolumeSubpathEnvExpansion feature gate to be enabled. It is enabled by default starting with Kubernetes 1.15. The subPath and subPathExpr properties are mutually exclusive.

如果您有任何问题,请告诉我。