删除 StatefulSet

StatefulSet 同时支持级联非级联删除:

  • 使用非级联方式删除 StatefulSet 时,StatefulSet 的 Pod 不会被删除

  • 使用级联删除时,StatefulSet 和它的 Pod 都会被删除

非级联删除

使用 kubectl delete 删除 StatefulSet。请确保提供了 --cascade=orphan 参数给命令。这个参数告诉 Kubernetes 只删除 StatefulSet 而不要删除它的任何 Pod。

$ kubectl delete sts web --cascade=orphan
statefulset.apps "web" deleted

$ kubectl get pod -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          2m4s
web-1   1/1     Running   0          2m1s
web-2   1/1     Running   0          32s

由于此时删除了 StatefulSet,它管理的 Pod 变成了“孤儿” Pod,因此单独删除 Pod 时,该 Pod 不会被重建

$ kubectl delete pod web-0
pod "web-0" deleted

$ kubectl get pod -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          2m25s
web-2   1/1     Running   0          56s

当再次创建此 StatefulSet 时:

  • web-0 会被重新创建

  • 由于 web-1 已经存在,因此不会被再次创建

  • 因为最初此 StatefulSet 的 replicas 是 2,所以 web-2 会被删除

忽略 AlreadyExists 错误,因为只删除了 StatefulSet 并没删除 Service,所以在此创建 Service 时会提示已经存在该 Service

$ kubectl create -f web-statefulset.yaml 
statefulset.apps/web created
Error from server (AlreadyExists): error when creating "web-statefulset.yaml": services "nginx" already exists

$ kubectl get pod -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          2m44s
web-2   1/1     Running   0          75s
web-0   0/1     Pending   0          0s
web-0   0/1     Pending   0          0s
web-0   0/1     ContainerCreating   0          1s
web-0   0/1     ContainerCreating   0          1s
web-0   1/1     Running             0          2s
web-2   1/1     Terminating         0          81s
web-2   1/1     Terminating         0          82s
web-2   0/1     Terminating         0          82s
web-2   0/1     Terminating         0          82s
web-2   0/1     Terminating         0          82s
web-2   0/1     Terminating         0          82s

$ kubectl get pod -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          32s
web-1   1/1     Running   0          3m20s

级联删除

省略 --cascade=orphan 参数即为级联删除:

$ kubectl delete sts web 
statefulset.apps "web" deleted

$ kubectl get pod -l app=nginx
No resources found in default namespace.

也可以使用 -f 指定创建 StatefulSet 和 Service 的 YAML 文件,直接删除 StatefulSet 和 Service:

$ kubectl delete -f web-statefulset.yaml
service "nginx" deleted
statefulset.apps "web" deleted

最后更新于