問題
刪除namespace時震贵,一直處于 terminating 狀態(tài)擎宝。無法刪除。
$ kubectl delete ns skynet
Error from server (Conflict): Operation cannot be fulfilled on namespaces "skynet": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
$ kubectl describe ns skynet
Name: skynet
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"skynet","namespace":""}}
Status: Terminating
根本原因
namespace刪除卡住有很多原因涡上,一般最常見的原因是namespace下有某些資源沒有被刪除導致namespace刪除卡死趾断。
解決方案
常見的有兩種處理方案,根據(jù)我們的目的可以選擇不同方案來刪除卡死的namespace
- 檢查和定位namespace刪除失敗的原因吩愧,并手動清空namespace下無法自動刪除的資源
- 移除namespace的finalizers芋酌,讓 kube-api直接刪除namespace
方案1
刪除namespace時,如果有些資源無法自動刪除雁佳,會導致namespace無法刪除脐帝,所以需要找到不能被刪除的資源并手動刪除同云,namespace就會被清理。
- 檢查定位namespace下沒有刪除的資源
kubectl api-resources --verbs=list --namespaced -o name | xargs kubectl get -n <namespace>
- 檢測是否有外部注冊的 apiservices 服務無法訪問
kubectl get apiservice | grep False
方案2
刪除namespace時腮恩,如果 namespace 字段 finalizers 不為空梢杭,且值是 kubernetes 時,apiserver 服務就會嘗試清理該namespace下的所有資源秸滴,如果有部分資源無法被清理武契,則刪除過程就會卡住。當把 finalizers 更新為空時荡含,apiserver 就會跳過清理咒唆,直接刪除namespace。但這種方案會有沒有刪除的資源遺留在集群释液。
- 獲取namespace
$ NAMESPACE=skynet
$ kubectl get ns $NAMESPACE -o json > /tmp/${NAMESPACE}.json
$ cat /tmp/${NAMESPACE}.json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-02-04T16:15:06Z",
"name": "skynet",
"resourceVersion": "20879144",
"selfLink": "/api/v1/namespaces/skynet",
"uid": "0951bcf9-2898-11e9-8e38-0242ac11000b"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
}
- 修改 finalizers 字段為空全释,如下
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-02-04T16:15:06Z",
"name": "skynet",
"resourceVersion": "20879144",
"selfLink": "/api/v1/namespaces/skynet",
"uid": "0951bcf9-2898-11e9-8e38-0242ac11000b"
},
"spec": {
"finalizers": [
]
},
"status": {
"phase": "Active"
}
}
- 更新namespace對象
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://kubernetes-cluster-ip/api/v1/namespaces/skynet/finalize