关于cassandra:使用kubectl补丁将卷添加到Kubernetes StatefulSet

Adding a volume to a Kubernetes StatefulSet using kubectl patch

问题总结:

我正在遵循Kubernetes指南来设置示例Cassandra集群。群集已启动并正在运行,我想向每个节点添加第二个卷,以便尝试启用将存储在单独卷上的Cassandra备份。

我试图解决的问题:

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

1
2
3
$ 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/

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

我的cassandra-backup-patch.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

但是,这导致以下错误:

1
2
$ 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,所以我的方法可能是完全错误的。非常感谢任何意见或帮助。


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

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

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