本文永久链接: https://www.xtplayer.cn/kubernetes/forces-delete-terminated-namespace/

有时候删除命名空间后,发现命名空间一直处于 Terminating 状态。通过执行 kubectl delete namespace ${namespace} --force --grace-period=0 强制删除命令依然无法删除。

  1. 登录 rancher ui,切换到需要删除命名空间的集群对应的 集群首页,点击 kubeconfig 文件 保存备用。如果是非 rancher 管理的 k8s 集群,请准备好对应集群的 kubeconfig 配置文件。

  2. 登录一个安装有 jq(https://stedolan.github.io/jq/)和 curl 工具的主机。

  3. 接着执行以下命令:

    KUBE_CONFIG=xxx.yaml
    TERMINATING_NAMESPACE=xxx

    kubectl --kubeconfig ${KUBE_CONFIG} get ns ${TERMINATING_NAMESPACE} -ojson| \
    jq 'del(.spec.finalizers[])'| \
    jq 'del(.metadata.finalizers)' > ${TERMINATING_NAMESPACE}.json

    kubectl --kubeconfig ${KUBE_CONFIG} proxy --port=8765;

    curl -k -H "Content-Type: application/json" -X PUT --data-binary @${TERMINATING_NAMESPACE}.json "http://127.0.0.1:8765/api/v1/namespaces/${TERMINATING_NAMESPACE}/finalize"
  4. 如果以上方法不可用,也可以尝试以下方法:

    KUBE_CONFIG=xxx.yaml
    TERMINATING_NAMESPACE=xxx

    kubectl --kubeconfig ${KUBE_CONFIG} get ns ${TERMINATING_NAMESPACE} -o json | jq 'del(.spec.finalizers[])' | kubectl --kubeconfig ${KUBE_CONFIG} replace --raw "/api/v1/namespaces/${TERMINATING_NAMESPACE}/finalize" -f -