删除 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 可能会触发对支持的持久卷的删除,具体取决于存储类别和回收策略。您永远不应该假设在删除声明后能够访问卷。

完全删除 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)