繁体   English   中英

如何将使用持久卷声明的 Kubernetes 部署扩展到 2 个 Pod?

[英]How to scale a Kubernetes deployment which uses a Persistent Volume Claim to 2 Pods?

我有一个需要存储持久数据的 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 做我想做的事?

您应该为此使用StatefulSet 这适用于具有持久数据的 pod,这些数据应该能够在 pod 重启后继续存在。 副本具有一定的顺序并以这种方式命名(my-app-0,my-app-1,...)。 它们按此顺序停止和重新启动,并将在重新启动/更新后安装相同的卷。

使用StatefulSet ,您可以使用volumeClaimTemplates通过创建新 pod 来动态创建新的PersistentVolumes 因此,每次创建 pod 时,您的存储 class 都会配置一个卷。

来自文档:

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

每个 pod 都应该有自己的持久空间(但具有相同的路径名),因此不会与其他 pod 混淆。

因此,请改用StatefulSet 大多数事情都会以相同的方式工作,除了每个 Pod 将获得自己独特的 Persistent Volume。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM