kubernetes - 如何将使用 Persistent Volume Claim 的 Kubernetes 部署扩展到 2 个 Pod?
问题描述
我有一个需要存储持久数据的 Kubernetes 部署(确切地说是 apache 水槽)。它有一个 PVC 设置并绑定到一个路径,它可以正常工作。
当我通过 kubernetes 仪表板简单地增加部署规模时,它给了我一个错误,说多个 pod 正在尝试附加相同的持久卷。我的部署描述是这样的(我试图删除不相关的部分)
{
"kind": "Deployment",
"apiVersion": "extensions/v1beta1",
"metadata": {
"name": "myapp-deployment",
"labels": {
"app": "myapp",
"name": "myapp-master"
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app": "myapp",
"name": "myapp-master"
}
},
"template": {
"spec": {
"volumes": [
{
"name": "myapp-data",
"persistentVolumeClaim": {
"claimName": "myapp-pvc"
}
}
],
"containers": [
{
"name": "myapp",
"resources": {},
"volumeMounts": [
{
"name": "ingestor-data",
"mountPath": "/data"
}
]
}
]
}
},...
每个 pod 都应该有自己的持久空间(但具有相同的路径名),因此不会与其他 pod 混淆。我尝试在上面的卷阵列中添加一个新卷,并在卷挂载阵列中添加一个卷挂载,但它不起作用(我猜这意味着“将两个卷绑定到一个容器”)
我应该改变什么来拥有 2 个具有单独持久卷的 pod?我应该改变什么来拥有 N 个 Pod 和 N 个 PVC,这样我就可以自由地向上和向下扩展部署?
注意:我在这里看到了一个类似的问题,它解释了 N 个 Pod 无法使用部署完成。是否可以只用 2 个 pod 做我想做的事?
解决方案
你应该使用 a StatefulSet
。这适用于具有持久数据的 pod,这些数据应该能够在 pod 重启后继续存在。副本具有一定的顺序并以这种方式命名(my-app-0,my-app-1,...)。它们按此顺序停止和重新启动,并将在重新启动/更新后安装相同的卷。
StatefulSet
您可以使用 a通过创建新 podvolumeClaimTemplates
来动态创建新的。PersistentVolumes
因此,每次创建 pod 时,您的存储类都会配置一个卷。
来自文档:
volumeClaimTemplates 将使用 PersistentVolume Provisioner 提供的 PersistentVolumes 提供稳定的存储
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
有关更多详细信息,请参阅文档: https ://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#components