【问题标题】:Adding a volume to a Kubernetes StatefulSet using kubectl patch使用 kubectl 补丁将卷添加到 Kubernetes StatefulSet
【发布时间】:2020-02-11 20:47:44
【问题描述】:

问题总结:

我正在关注Kubernetes guide to set up a sample Cassandra cluster。集群已启动并正在运行,我想为每个节点添加第二个卷,以便尝试为 Cassandra 启用备份,该备份将存储在单独的卷上。

我的解决方案尝试:

我尝试通过添加新的volumeMountsvolumeClaimTemplates 条目来编辑我的cassandra-statefulset.yaml 文件,然后重新应用它,但收到以下错误消息:

$ kubectl apply -f cassandra-statefulset.yaml 
storageclass.storage.k8s.io/fast unchanged
The StatefulSet "cassandra" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden

然后我尝试启用滚动更新并按照此处的文档修补我的配置: https://kubernetes.io/docs/tasks/run-application/update-api-object-kubectl-patch/

$ kubectl patch statefulset cassandra -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
statefulset.apps/cassandra patched (no change)

我的cassandra-backup-patch.yaml

spec:
  template:
    spec:
      containers:
        volumeMounts:
        - name: cassandra-backup
          mountPath: /cassandra_backup
  volumeClaimTemplates:
  - metadata:
      name: cassandra-backup
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: fast
      resources:
        requests:
          storage: 1Gi

但是这导致了以下错误:

$ kubectl patch statefulset cassandra --patch "$(cat cassandra-backup-patch.yaml)"
The request is invalid: patch: Invalid value: "map[spec:map[template:map[spec:map[containers:map[volumeMounts:[map[mountPath:/cassandra_backup name:cassandra-backup]]]]] volumeClaimTemplates:[map[metadata:map[name:cassandra-backup] spec:map[accessModes:[ReadWriteOnce] resources:map[requests:map[storage:1Gi]] storageClassName:fast]]]]]": cannot restore slice from map

谁能指出为每个节点添加额外卷的正确方法或解释为什么补丁不起作用?这是我第一次使用 Kubernetes,所以我的方法可能完全错误。非常欢迎任何评论或帮助,在此先感谢。

【问题讨论】:

    标签: kubernetes cassandra kubectl


    【解决方案1】:

    答案在您的第一个日志中:

    The StatefulSet "cassandra" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy'
    

    statefulset 中的某些字段在创建后无法更改。您可能需要删除并重新创建 statefulset 以添加新的 volumeClaimTemplate

    编辑: 即使您删除了statefulset,让您的 pod 继续运行也有很多时候是有用的。要完成此操作,请在删除操作上使用 --cascade=false 标志。

    kubectl delete statefulset <name> --cascade=false
    

    然后,当您使用更新后的 VPC 重新创建有状态集时,您的工作负载将保持运行。

    【讨论】:

      【解决方案2】:

      正如switchboard.op 所述,删除答案。

      但是

      注意删除这些对象:

      • PersistentVolumeClaim (kubectl get pvc)
      • PersistentVolume (kubectl get pv)

      例如,如果您只想使用 helm uninstall 而不是 kubectl delete statefulset/&lt;item&gt; will be deleted 则除非卷有任何其他参考,并且如果您没有包含先前 YAML 的备份ID(即不仅从 Helm 模板生成,而且从协调器生成)你可能会有痛苦的一天。

      PVC 和 PV 保存底层(可能/大部分?)供应商特定卷引用的 ID 和其他引用属性,例如S3 或其他对象或文件存储实现在后台用作Pod 或其他资源中的卷。

      删除或以其他方式修改 StatefulSet 如果您在规范中保留 PVC 名称不会影响安装 正确资源.

      如果有疑问,请始终在本地复制整个卷,然后再对 PVC 和 PV 进行破坏性操作,如果您将来需要它们或在不知道底层源代码的情况下运行命令,例如作者:

      kubectl cp <some-namespace>/<some-pod>:/var/lib/something /tmp/backup-something
      

      然后通过反转参数将其加载回来。

      同样对于 Helm 的使用,删除 StatefulSet,然后发出 helm upgrade 命令,它将修复丢失的 StatefulSet,而无需触及 PVC 和 PV。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-19
        • 2019-12-09
        • 2019-01-12
        • 2020-10-23
        • 1970-01-01
        • 2020-01-02
        • 2018-09-18
        • 1970-01-01
        相关资源
        最近更新 更多