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

时间:2020-07-24 15:42:19

标签: kubernetes minikube provisioning persistent-volumes kubernetes-statefulset

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

一个例子是:

  • PersistentVolume =“ /数据”
  • 豆荚:
    • pod-0 =“ / data / pod-0”
    • pod-1 =“ / data / pod-1”

我正在努力让副本为自己创建新文件夹。对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

volumeClaimTemplates是允许豆荚声明的清单 参考。 StatefulSet控制器负责映射 声明的网络身份以维持身份的方式 荚。此列表中的每个声明都必须至少有一个匹配项( 名称)volumeMount安装在模板的一个容器中。对此的主张 list优先于模板中的任何卷,并且相同 名称。

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

如果我们以这个yaml为例:

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

一旦部署了Pod,您会注意到正在创建Pod,并在创建过程中请求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对持久卷的专有使用。 这意味着,如果我们逐个查看卷,则会发现每个卷都分配给特定的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开始默认启用它。 subPathsubPathExpr属性是互斥的。

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