K8S Namespace无法删除,状态Terminating解决办法
首先检查哪些namespace无法删除,此时应保证namespace中没有资源
查看namespace资源如下:
➜ ~ kubectl get all -n ingress
➜ ~ kubectl get ns |grep -vi "active"
NAME STATUS AGE
cattle-system Terminating 98d
ingress Terminating 141d
local Terminating 98d
kubectl get ns local -o json > local.json
➜ ~ cat local.json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"cattle.io/status": "{\"Conditions\":[{\"Type\":\"ResourceQuotaInit\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2018-08-27T08:10:43Z\"},{\"Type\":\"InitialRolesPopulated\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2018-08-27T08:10:43Z\"}]}",
"lifecycle.cattle.io/create.namespace-auth": "true",
"management.cattle.io/system-namespace": "true"
},
"creationTimestamp": "2018-08-27T08:10:42Z",
"deletionTimestamp": "2018-11-07T03:06:16Z",
"finalizers": [
"controller.cattle.io/namespace-auth"
],
"name": "local",
"resourceVersion": "37774346",
"selfLink": "/api/v1/namespaces/local",
"uid": "b0d838e5-a9d0-11e8-bbd6-00163e069697"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Terminating"
}
}
删除json文件中对应的这2行,然后保存
执行以下命令
curl -H "Content-Type: application/json" -X PUT --data-binary @local.json http://<master_node_ip>:8080/api/v1/namespaces/local/finalize
稍等一会, namespace 就会被删除掉了
如果以上方法无法奏效,那么可以采取以下方法解决:
# 删除default namespace下的pod名为pod-to-be-deleted-0
ETCDCTL_API=3 etcdctl del /registry/pods/default/pod-to-be-deleted-0
# 删除需要删除的NAMESPACE
etcdctl del /registry/namespaces/NAMESPACENAME
操作etcd数据库需要谨慎,不建议如此操作,只是作为一个最后的解决方案