前言
在 Kubernetes 中,经常遇到 Terminating
状态的资源,怎么删都删不掉,这里整理一些常遇到的问题。
强制删除 Pod
kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period=0
加参数 --force --grace-period=0,grace-period 表示过渡存活期,默认 30s,在删除 POD 之前允许 POD 慢慢终止其上的容器进程,从而优雅退出,0 表示立即终止 POD
强制删除 PV、PVC
kubectl patch pv xxx -p '{"metadata":{"finalizers":null}}'
kubectl patch pvc xxx -p '{"metadata":{"finalizers":null}}'
删除 CRD 资源
kubectl patch crd/此处写CRD的名字 -p '{"metadata":{"finalizers":[]}}' --type=merge
强制删除 Namespace
(1)先用以下方式删除
kubectl delete ns <terminating-namespace> --force --grace-period=0
如果发现删除不了,就用下面的方式。
(2)删除顽固 Namespace
首先,导出顽固 Namespace 的 JSON 文件。
kubectl get namespace <terminating-namespace> -o json >tmp.json
然后,修改 JSON 文件,删除 finalizers 字段的值。
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2021-11-24T02:28:58Z",
"deletionTimestamp": "2021-12-13T02:58:33Z",
"labels": {
"kubesphere.io/namespace": "cert-manager"
},
"name": "cert-manager",
"resourceVersion": "351925531",
"selfLink": "/api/v1/namespaces/cert-manager",
"uid": "67f1676b-9d78-44eb-8639-fcec47220cfa"
},
# 此位置
"spec": {
},
"status": {
"conditions": [
{
"lastTransitionTime": "2021-12-13T02:58:38Z",
"message": "Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: acme.yourcompany.com/v1alpha1: the server is currently unable to handle the request",
"reason": "DiscoveryFailed",
"status": "True",
"type": "NamespaceDeletionDiscoveryFailure"
},
{
"lastTransitionTime": "2021-12-13T02:58:40Z",
"message": "All legacy kube types successfully parsed",
"reason": "ParsedGroupVersions",
"status": "False",
"type": "NamespaceDeletionGroupVersionParsingFailure"
},
{
"lastTransitionTime": "2021-12-13T02:58:40Z",
"message": "All content successfully deleted",
"reason": "ContentDeleted",
"status": "False",
"type": "NamespaceDeletionContentFailure"
}
],
"phase": "Terminating"
}
}
开启 Proxy。
kubectl proxy
执行以下命令进行删除。
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize
最后查看 Namespace 是否删除。如果没有,那就再试几次 _