【问题标题】:Dynamic volume provisioning folder per pod in a volume?卷中每个pod的动态卷配置文件夹?
【发布时间】:2020-07-24 15:42:19
【问题描述】:

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

一个例子是:

  • PersistentVolume = "/data"
  • 豆荚:
    • pod-0 = "/data/pod-0"
    • pod-1 = "/data/pod-1"

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

【问题讨论】:

  • 你能告诉用例或者你想要达到什么目的吗?
  • @tarunkhosla 我解释了问题中的用例?我不明白我还能提供什么更多信息,我希望 StatefulSet 根据副本数量在卷中为每个 pod 创建一个文件夹。
  • 你解释了你想要什么,但你还没有解释这里的用途和目标是什么。你能提供更多背景信息吗?

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


【解决方案1】:

volumeClaimTemplates 是允许 Pod 的声明列表 参考。 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 对 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 开始默认启用它。 subPathsubPathExpr 属性是互斥的。

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

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2023-03-12
    • 2019-04-22
    • 2020-01-31
    • 2019-10-19
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多