k8s中刪除處于Terminating狀態(tài)的namespace
每當刪除 namespace 或 pod 等一些 Kubernetes 資源時,有時資源狀態(tài)會卡在 Terminating,很長時間無法刪除,甚至有時增加 --force grace-period=0 之后還是無法正常刪除。這時就需要 edit 該資源,或者將該資源導出為 json(通過調(diào)用原生接口進行刪除), 將 finalizers 字段設(shè)置為 [],之后 Kubernetes 資源就正常刪除了。
查看 ns 狀態(tài)
[root@master1 ~]# kubectl get ns
NAME STATUS AGE
cattle-fleet-system Active 7d19h
cattle-impersonation-system Active 7d19h
cattle-system Active 7d19h
default Active 8d
kube-node-lease Active 8d
kube-public Active 8d
kube-system Active 8d
local Active 7d19h
monitoring Terminating 7d19h
test Active 23h
可以看到 monitoring 這個 namespace 一直處于Terminating
狀態(tài),一般情況下強刪是刪不掉的,強刪的方法如下:這個方法在這里會卡主,也是刪不掉的
[root@master1 ~]# kubectl delete ns monitoring --force --grace-period=0
如果刪不掉,就參考下面的方法
獲取 namespace 的 json 文件
[root@master1 ~]# kubectl get ns monitoring -o json > /tmp/monitoring.json
查看monitoring.json
的內(nèi)容
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "monitoring",
"uid": "4db2f7a3-5fb2-434a-a2d2-59c70453c1b7",
"resourceVersion": "2896381",
"creationTimestamp": "2023-05-17T06:51:39Z",
"deletionTimestamp": "2023-05-24T09:08:47Z",
"deletionGracePeriodSeconds": 0,
"labels": {
"field.cattle.io/projectId": "p-8bqcb",
"kubernetes.io/metadata.name": "monitoring"
},
"annotations": {
"cattle.io/status": "{\"Conditions\":[{\"Type\":\"ResourceQuotaInit\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2023-05-17T06:51:40Z\"},{\"Type\":\"InitialRolesPopulated\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2023-05-17T06:51:41Z\"}]}",
"field.cattle.io/projectId": "c-m-bxmlx5bv:p-8bqcb",
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n"},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Terminating"
}
}
修改此monitoring.json
文件內(nèi)容為:
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "monitoring",
"uid": "4db2f7a3-5fb2-434a-a2d2-59c70453c1b7",
"resourceVersion": "2896381",
"creationTimestamp": "2023-05-17T06:51:39Z",
"deletionTimestamp": "2023-05-24T09:08:47Z",
"deletionGracePeriodSeconds": 0,
"labels": {
"field.cattle.io/projectId": "p-8bqcb",
"kubernetes.io/metadata.name": "monitoring"
},
"annotations": {
"cattle.io/status": "{\"Conditions\":[{\"Type\":\"ResourceQuotaInit\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2023-05-17T06:51:40Z\"},{\"Type\":\"InitialRolesPopulated\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2023-05-17T06:51:41Z\"}]}",
"field.cattle.io/projectId": "c-m-bxmlx5bv:p-8bqcb",
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n"},
"spec": {
},
"status": {
"phase": "Terminating"
}
}
調(diào)用 api-server 接口進行刪除
打開一個新的終端,或者把下面的命令放到后臺執(zhí)行
[root@master1 prometheus]# kubectl proxy
Starting to serve on 127.0.0.1:8001
調(diào)用接口刪除
[root@master1 ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @monitoring.json http://127.0.0.1:8001/api/v1/namespaces/monitoring/finalize
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "monitoring",
"uid": "4db2f7a3-5fb2-434a-a2d2-59c70453c1b7",
"resourceVersion": "2896381",
"creationTimestamp": "2023-05-17T06:51:39Z",
"deletionTimestamp": "2023-05-24T09:08:47Z",
"deletionGracePeriodSeconds": 0,
"labels": {
"field.cattle.io/projectId": "p-8bqcb",
"kubernetes.io/metadata.name": "monitoring"
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}
輸出以上內(nèi)容表示刪除成功。
注: 如果kubectl get ns monitoring -o json
的結(jié)果中"spec": {}
中為空,則需要看下metadata
部分是否有finalizers
字段,如下以cattle-system
所示:文章來源:http://www.zghlxwxcb.cn/news/detail-466846.html
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"cattle.io/status": "{\"Conditions\":[{\"Type\":\"ResourceQuotaInit\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2023-05-17T06:51:40Z\"},{\"Type\":\"InitialRolesPopulated\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2023-05-17T06:51:41Z\"}]}",
"field.cattle.io/projectId": "c-m-bxmlx5bv:p-8bqcb",
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n",
"lifecycle.cattle.io/create.namespace-auth": "true"
},
"creationTimestamp": "2023-05-17T06:51:39Z",
"deletionTimestamp": "2023-05-24T09:08:47Z",
"deletionGracePeriodSeconds": 0,
"finalizers": [
"controller.cattle.io/namespace-auth"
],
"labels": {
"field.cattle.io/projectId": "p-wfknh"
},
"name": "cattle-system",
"resourceVersion": "165368",
"selfLink": "/api/v1/namespaces/cattle-system",
"uid": "223ad163-507c-4efe-b3a3-d3bc4b7a5211"
},
"spec": {},
"status": {
"phase": "Terminating"
}
}
這里"spec": {},
結(jié)果為空,無論我們怎么執(zhí)行,此時此 ns 都不會被刪除,此時想弄清楚這個問題,需要先了解下finalizers
這個的含義 Finalizers 字段屬于 Kubernetes GC 垃圾收集器,是一種刪除攔截機制,能夠讓控制器實現(xiàn)異步的刪除前(Pre-delete)回調(diào)。其存在于任何一個資源對象的 Meta 中,在 k8s 源碼中聲明為 []string,該 Slice 的內(nèi)容為需要執(zhí)行的攔截器名稱。
對帶有 Finalizer 的對象的第一個刪除請求會為其 metadata.deletionTimestamp 設(shè)置一個值,但不會真的刪除對象。一旦此值被設(shè)置,finalizers 列表中的值就只能被移除。
當 metadata.deletionTimestamp 字段被設(shè)置時,負責監(jiān)測該對象的各個控制器會通過輪詢對該對象的更新請求來執(zhí)行它們所要處理的所有 Finalizer。 當所有 Finalizer 都被執(zhí)行過,資源被刪除。
metadata.deletionGracePeriodSeconds 的取值控制對更新的輪詢周期。
每個控制器要負責將其 Finalizer 從列表中去除。
每執(zhí)行完一個就從 finalizers 中移除一個,直到 finalizers 為空,之后其宿主資源才會被真正的刪除。
看到這里有 finalizers 時,需要在導出的json文件中將finalizers的內(nèi)容也刪除,并再次調(diào)用接口刪除。方法如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-466846.html
"finalizers": [
],
[root@master1 ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @monitoring.json http://127.0.0.1:8001/api/v1/namespaces/monitoring/finalize
到了這里,關(guān)于k8s中如何調(diào)用接口刪除處于Terminating狀態(tài)的namespace的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!