本任务向您展示如何删除 StatefulSet。
您可以像删除 Kubernetes 中的其他资源一样删除 StatefulSet:使用 kubectl delete 命令,并通过文件或名称指定要删除的 StatefulSet。
kubectl delete -f <file.yaml>
kubectl delete statefulsets <statefulset-name>
在删除 StatefulSet 本身之后,您可能需要单独删除关联的无头(Headless)服务。
kubectl delete service <service-name>
通过 kubectl 删除 StatefulSet 时,StatefulSet 会缩容至 0。作为该工作负载一部分的所有 Pod 也会被删除。如果您只想删除 StatefulSet 而不删除 Pod,请使用 --cascade=orphan。例如:
kubectl delete -f <file.yaml> --cascade=orphan
通过向 kubectl delete 传递 --cascade=orphan,即使在删除 StatefulSet 对象本身之后,StatefulSet 管理的 Pod 仍会被保留。如果这些 Pod 带有标签 app.kubernetes.io/name=MyApp,您可以按如下方式删除它们:
kubectl delete pods -l app.kubernetes.io/name=MyApp
删除 StatefulSet 中的 Pod 不会删除关联的卷。这是为了确保您在删除卷之前有机会从卷中复制数据。在 Pod 终止后删除 PVC 可能会触发对底层 Persistent Volume 的删除,具体取决于存储类和回收策略。在删除 PVC 后,您绝不应假设仍然可以访问该卷。
要删除 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 长时间处于“Terminating”或“Unknown”状态,您可能需要手动干预以从 apiserver 强制删除这些 Pod。这是一项潜在的危险操作。有关详细信息,请参阅强制删除 StatefulSet Pod。
了解更多关于强制删除 StatefulSet Pod的信息。