删除 StatefulSet
此任务向您展示如何删除 StatefulSet。
准备工作
- 此任务假设您的集群上运行着一个由 StatefulSet 表示的应用程序。
删除 StatefulSet
您可以使用与删除 Kubernetes 中其他资源相同的方式删除 StatefulSet:使用 kubectl delete
命令,并通过文件或名称指定 StatefulSet。
kubectl delete -f <file.yaml>
kubectl delete statefulsets <statefulset-name>
在删除 StatefulSet 本身后,您可能需要单独删除关联的无头服务。
kubectl delete service <service-name>
通过 kubectl
删除 StatefulSet 时,StatefulSet 会缩减至 0。属于此工作负载的所有 Pod 也会被删除。如果您只想删除 StatefulSet 而不删除 Pod,请使用 --cascade=orphan
。例如
kubectl delete -f <file.yaml> --cascade=orphan
通过将 --cascade=orphan
传递给 kubectl delete
,即使在 StatefulSet 对象本身被删除后,StatefulSet 管理的 Pod 也会被保留。如果 Pod 具有标签 app.kubernetes.io/name=MyApp
,则您可以按如下方式删除它们
kubectl delete pods -l app.kubernetes.io/name=MyApp
持久卷
删除 StatefulSet 中的 Pod 不会删除关联的卷。这是为了确保您有机会在删除卷之前将数据从卷中复制出来。在 Pod 终止后删除 PVC 可能会触发删除后备持久卷,具体取决于存储类和回收策略。您永远不应该假设在删除声明后能够访问卷。
注意
删除 PVC 时要小心,因为它可能会导致数据丢失。完全删除 StatefulSet
要删除 StatefulSet 中的所有内容,包括关联的 Pod,您可以运行一系列类似于以下内容的命令
grace=$(kubectl get pods <stateful-set-pod> --template '{{.spec.terminationGracePeriodSeconds}}')
kubectl delete statefulset -l app.kubernetes.io/name=MyApp
sleep $grace
kubectl delete pvc -l app.kubernetes.io/name=MyApp
在上面的示例中,Pod 具有标签 app.kubernetes.io/name=MyApp
;请根据需要替换您自己的标签。
强制删除 StatefulSet Pod
如果您发现 StatefulSet 中的某些 Pod 长时间处于“正在终止”或“未知”状态,则您可能需要手动干预以从 apiserver 中强制删除这些 Pod。这是一项潜在的危险任务。有关详细信息,请参阅强制删除 StatefulSet Pod。
后续步骤
详细了解强制删除 StatefulSet Pod。