基本上,我要创建一个带有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中以使用子文件夹
我能够实现上述情况,您需要在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数据-test-sf-0和data-test- sf-1,它们将绑定到PV-0和Pv-1。因此,test-sf-0将写入PV-0中指定的位置,而test- sf-1将写入PV-1中指定的位置。希望这可以帮助。