使用kubectl补丁将卷添加到Kubernetes StatefulSet

时间:2020-02-11 20:47:44

标签: kubernetes cassandra kubectl

问题摘要:

我正在关注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,所以我的方法可能是完全错误的。非常感谢您提供任何意见或帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

switchboard.op所述,删除答案。

但是

注意删除这些对象:

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

例如,如果您只想执行 helm uninstall 而不是 kubectl delete statefulset/<item> will be deleted 除非有任何其他卷参考并且如果您没有备份在包含 ID 的先前 YAML 中(即不仅从 Helm 模板生成,还从编排器生成),您可能会有痛苦的一天。

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

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

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

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

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

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