【问题标题】:Is it possible to mount different pods to the same portion of a local persistent volume?是否可以将不同的 pod 挂载到本地持久卷的同一部分?
【发布时间】:2018-10-23 23:15:52
【问题描述】:

基本上,我正在创建一个带有 2 个 pod(单个主机集群)的 StatefulSet 部署,我希望每个 pod 都能够挂载到主机中的基本文件夹以及它下面的子文件夹:

基础文件夹挂载:/mnt/disks/ssd

Pod#1 - /mnt/disks/ssd/pod-1

Pod#2 - /mnt/disks/ssd/pod-2

我只设法将第一个 pod 挂载到基本文件夹,但无法挂载第二个文件夹(因为该卷已被占用)

这是音量:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-local-pv
spec:
  capacity:
    storage: 5Gi 
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/ssd
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - ubuntukuber

这是有状态集中的用法:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: app
  namespace: test-ns
spec:
  serviceName: app
  replicas: 2
....
....
        volumeMounts:
          - name: data
            mountPath: /var/lib/app/data
volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: "local-storage"
        resources:
          requests:
            storage: 2Gi

所以,我基本上希望每个副本都使用自己的子文件夹 - 如何实现它?

== 编辑 ==

我已经取得了一些进展,我可以使用以下 YAML 将多个副本挂载到同一个挂载中(我尝试在其上执行此操作的应用程序是 rabbitmq - 所以我将应用程序名称保留为是)

---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
  namespace: test-rabbitmq
  labels:
    type: local
spec:
  storageClassName: local
  capacity:
    storage: 6Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/disks"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: hostpath-pvc
  namespace: test-rabbitmq
spec:
  storageClassName: local
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  selector:
    matchLabels:
      type: local
---

在 StatefulSet 中,我声明了这个卷:

  volumes:
    - name: rabbitmq-data
      persistentVolumeClaim:
        claimName: hostpath-pvc

并安装“rabbitmq-data”。

两个 pod 都挂载到同一个文件夹,但不会创建子文件夹 - 这不是什么可怕的情况,因为默认情况下有 rabbitmq 的子文件夹 - 我会尝试将它扩展到每个 pod 以使用子文件夹

【问题讨论】:

    标签: docker kubernetes volume


    【解决方案1】:

    我能够实现上述场景,您需要的是您的 pv 中的“claimRef”来绑定您的 PVC。请看下面的 pv json 和 statefulset json

    PV-0.json

    {
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "pv-data-vol-0",
        "labels": {
          "type": "local"
        }
      },
      "spec": {
        "capacity": {
          "storage": "10Gi"
        },
        "accessModes": [
          "ReadWriteOnce"
        ],
        "storageClassName": "local-storage",
        "local": {
          "path": "/prafull/data/pv-0"
        },
        "claimRef": {
          "namespace": "default",
          "name": "data-test-sf-0"
        },
        "nodeAffinity": {
          "required": {
            "nodeSelectorTerms": [
              {
                "matchExpressions": [
                  {
                    "key": "kubernetes.io/hostname",
                    "operator": "In",
                    "values": [
                      "ip-10-0-1-46.ec2.internal"
                    ]
                  }
                ]
              }
            ]
          }
        }
      }
    }
    

    PV-1.json

    {
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "pv-data-vol-1",
        "labels": {
          "type": "local"
        }
      },
      "spec": {
        "capacity": {
          "storage": "10Gi"
        },
        "accessModes": [
          "ReadWriteOnce"
        ],
        "storageClassName": "local-storage",
        "local": {
          "path": "/prafull/data/pv-1"
        },
        "claimRef": {
          "namespace": "default",
          "name": "data-test-sf-1"
        },
        "nodeAffinity": {
          "required": {
            "nodeSelectorTerms": [
              {
                "matchExpressions": [
                  {
                    "key": "kubernetes.io/hostname",
                    "operator": "In",
                    "values": [
                      "ip-10-0-1-46.ec2.internal"
                    ]
                  }
                ]
              }
            ]
          }
        }
      }
    }
    

    Statefulset.json

    {
      "kind": "StatefulSet",
      "apiVersion": "apps/v1beta1",
      "metadata": {
        "name": "test-sf",
        "labels": {
          "state": "test-sf"
        }
      },
      "spec": {
        "replicas": 2,
        "template": {
          "metadata": {
            "labels": {
              "app": "test-sf"
            },
            "annotations": {
              "pod.alpha.kubernetes.io/initialized": "true"
            }
          }
          ...
          ...
        },
        "volumeClaimTemplates": [
          {
            "metadata": {
              "name": "data"
            },
            "spec": {
              "accessModes": [
                "ReadWriteOnce"
              ],
              "storageClassName": "local-storage",
              "resources": {
                "requests": {
                  "storage": "10Gi"
                }
              }
            }
          }
        ]
      }
    }
    

    将创建两个 pod,test-sf-0 和 test-sf-1,然后创建两个 PVC data-test-sf-0 和 data-test-sf-1,它们将绑定到 PV分别为 -0 和 Pv-1。因此 test-sf-0 将写入 PV-0 中指定的位置,而 test-sf-1 将写入 PV-1 中指定的位置。希望这会有所帮助。

    【讨论】:

    • 天哪!就是这样:) 谢谢!你能解释一下这个说法吗?它是否将“数据”卷名称与 pod 名称(例如 data-rabbitmq-0)连接起来?
    • 不客气 :) claimRef 用于将您的 PV 绑定到特定的 PVC。每当您将 PVC 定义为 volumeClaimTemplates 时,PVC 的名称将是您提供的名称,后跟破折号和 pod 名称,例如 data-test-sf-0、data-test-sf-1。因此,通过在 PV 中使用 claimRef,您可以决定要绑定 PV 的 PVC。
    • 另外,我已经看到您对子文件夹的编辑,目前本地存储不支持自动创建子文件夹。因此,您在 PV 中提供的任何路径都必须存在。 "local": { "path": "/prafull/data/pv-0" },
    • 即使我故意创建子文件夹?那么目前没有办法将 pvc 绑定到存在子文件夹的 2 个副本吗?因为我尝试使用 env 变量,但它们根本没有被解释。任何有关 pv、pvc 绑定逻辑如何工作的读物也将受到欢迎:)
    • @PrafullLadha 在持久卷规范中指定 nodeAffinity 下的节点名称似乎并不能保证在正确的节点上调度 Pod,尽管官方 docs 在本地卷上说了什么。有时我会遇到StatefulSet pods 声称绑定到错误的持久卷的问题。我想知道这是否是特定于将 volumeClaimTemplates 与 StatefulSets 一起使用的问题,如您在上面的 StatefulSet.json 示例中提供的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2021-10-30
    • 2018-06-10
    • 2018-11-19
    • 2017-06-05
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多