如何更新有状态集中的 storageClassName?

e.f*_*.a. 8 kubernetes

我是 k8 的新手,并尝试更新 StatefulSet 中的 storageClassName。(从默认到 default-t1 仅在 yaml 中更改)

我尝试跑步kubectl apply -f test.yaml

第一个和第二个 Yaml(用于应用更新)之间的唯一区别是 storageClassName:default-t1 而不是 default

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  podManagementPolicy: "Parallel"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: default
      resources:
        requests:
          storage: 1Gi
Run Code Online (Sandbox Code Playgroud)

每次我尝试更新时都会得到The StatefulSet "web" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden

我缺少什么或者我应该采取什么步骤来做到这一点?

fil*_*lst 10

据我所知,没有简单的方法,但这是可能的。

  1. 将当前的 StatefulSet 配置保存到 yaml 文件:
kubectl get statefulset some-statefulset -o yaml > statefulset.yaml
Run Code Online (Sandbox Code Playgroud)
  1. 保存在 yaml 文件中的 StatefulSet 配置部分storageClassName的更改volumeClaimTemplate
  2. 使用以下命令删除 StatefulSet 而不删除 pod:
kubectl delete statefulset some-statefulset --cascade=orphan
Run Code Online (Sandbox Code Playgroud)
  1. 使用更改后的 StorageClass 重新创建 StatefulSet:
kubectl apply -f statefulset.yaml
Run Code Online (Sandbox Code Playgroud)
  1. 对于 StatefulSet 中的每个 Pod,首先删除其 PVC(它将陷入终止状态,直到删除该 pod),然后删除 Pod 本身

删除每个 Pod 后,StatefulSet 将重新创建一个 Pod(因为没有 PVC),并且使用 StatefulSet 中定义的更改的 StorageClass 为该 Pod 重新创建一个新的 PVC。


mus*_*cat 0

StatefulSet 的第一行应该定义一个“apiVersion”,你可以在这里看到示例statefulset。请在第一行添加:

apiVersion: apps/v1
Run Code Online (Sandbox Code Playgroud)

你能给我看看你的“www”PVC 文件的输出吗?

kubectl get pvc www -o yaml
Run Code Online (Sandbox Code Playgroud)

在 PVC 中,您有字段“storageClassName”,应在您要使用的 StorageClass 上设置该字段,因此在您的情况下它将是:

storageClassName: default-t1
Run Code Online (Sandbox Code Playgroud)