强制删除Terminating状态ns

kubectl get ns 查看处于Terminating的ns

[root@VM_1_4_centos ~]# kubectl get ns | grep testns
testns                   Terminating   21d

将处于Terminating的ns的描述文件保存下来

[root@VM_1_4_centos ~]# kubectl get ns testns -o json > tmp.json
[root@VM_1_4_centos ~]# cat tmp.json 
{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "creationTimestamp": "2020-10-13T14:28:07Z",
        "name": "testns",
        "resourceVersion": "13782744400",
        "selfLink": "/api/v1/namespaces/testns",
        "uid": "9ff63d71-a4a1-43bc-89e3-78bf29788844"
    },
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
    "status": {
        "phase": "Terminating"
    }
}

本地启动kube proxy

kubectl proxy --port=8081

新开窗口执行删除操作

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8081/api/v1/namespaces/testns/finalize

如果上面方法无法删除namespace,可以通过如下方法看下namespace是不是还有什么资源没有清理

若命名空间依然无法删除,则查询命名空间哪些资源
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <命名空间>


然后删除这些资源:
$ kubectl -n p-4q9rv delete projectalertgroup.management.cattle.io/projectalert-workload-alert --grace-period=0 --force


若 Pod 还是无法删除,可以在 Pod 中添加补丁:
kubectl -n p-4q9rv patch projectalertgroup.management.cattle.io/projectalert-workload-alert -p '{"metadata":{"finalizers":[]}}' --type='merge' 


添加补丁后,强制删除:
kubectl -n p-4q9rv delete projectalertrule.management.cattle.io/memory-close-to-resource-limited --grace-period=0 --force

然后执行下面命令删除namespace
kubectl patch namespace <命名空间> -p '{"metadata":{"finalizers":[]}}' --type='merge'
kubectl delete namespace cattle-system --grace-period=0 --force

其实也可以直接将修改对应ns生成json文件

[root@master-1 ~]# vim tmp.json
删除spec字段后,执行以下curl命令,使用kube-apiserver的8081端口,执行删除操作

#注意修改@XXX.json ,修改 namespaces/XXX/finalize ,其中XXX 表示你要删除的命名空间名称
[root@master-1 ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8081/api/v1/namespaces/mysql/finalize

用下面命令清理也可以

$ kubectl get ns delete-me -o json | jq '.spec.finalizers=[]' > ns-without-finalizers.json
cat ns-without-finalizers.json
$ kubectl proxy &
$ PID=$!
$ curl -X PUT http://localhost:8001/api/v1/namespaces/delete-me/finalize -H "Content-Type: application/json" --data-binary @ns-without-finalizers.json
$ kill $PID

© vishon all right reserved,powered by GitbookUpdated at 2021-11-04 11:58:08

results matching ""

    No results matching ""