是否可以将不同的 pods 挂载到本地持久卷的同一部分?
Is it possible to mount different pods to the same portion of a local persistent volume?
基本上,我正在创建一个带有 2 pods(单主机集群)的 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".
两者 pods 挂载到同一个文件夹,但不会创建子文件夹 - 这不是什么可怕的情况,因为默认情况下有 rabbitmq 的子文件夹 - 我会尝试将它扩展到每个 pod 中以使用子文件夹
我可以实现上面的场景,你需要的是"claimRef"在你的pv中绑定你的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"
}
}
}
}
]
}
}
将创建两个 pods 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 中指定的位置。希望这有帮助。
基本上,我正在创建一个带有 2 pods(单主机集群)的 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".
两者 pods 挂载到同一个文件夹,但不会创建子文件夹 - 这不是什么可怕的情况,因为默认情况下有 rabbitmq 的子文件夹 - 我会尝试将它扩展到每个 pod 中以使用子文件夹
我可以实现上面的场景,你需要的是"claimRef"在你的pv中绑定你的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"
}
}
}
}
]
}
}
将创建两个 pods 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 中指定的位置。希望这有帮助。