删除 StatefulSet

此任务展示了如何删除一个StatefulSet

准备工作

  • 本任务假设你的集群上运行着一个由 StatefulSet 代表的应用。

删除 StatefulSet

你可以像删除 Kubernetes 中的其他资源一样删除 StatefulSet:使用 kubectl delete 命令,并通过文件或名称指定 StatefulSet。

kubectl delete -f <file.yaml>
kubectl delete statefulsets <statefulset-name>

在 StatefulSet 本身被删除后,你可能需要单独删除相关的无头服务 (headless service)。

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

PersistentVolume

删除 StatefulSet 中的 Pod 不会删除相关的卷 (volumes)。这是为了确保在删除卷之前你有机会从中复制数据。在 Pod 终止后删除 PVC 可能会触发后端 Persistent Volumes 的删除,具体取决于存储类 (storage class) 和回收策略 (reclaim policy)。你不应假设在声明被删除后仍能访问卷。

完全删除 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 长时间停留在“Terminating”或“Unknown”状态,你可能需要手动干预以强制从 apiserver 中删除这些 Pod。这是一项潜在危险的任务。详情请参阅强制删除 StatefulSet Pod

下一步

了解更多关于强制删除 StatefulSet Pod 的信息。

上次修改时间:2023 年 3 月 14 日下午 8:12 (PST): 调整 run-application 中的换行 (8b527bab7e)