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

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

rancher 自定义 k8s 集群或者导入 rancher 管理的 k8s 集群

  1. 登录 rancher ui,切换到对应集群首页,点击 执行 kubectl 命令行

  2. 接着执行以下命令:

# 指定需要删除的命名空间
NAMESPACE= ''

# 以下为固定格式,不需要修改
RANCHER_SERVER_URL=$( kubectl config view -o json|jq -r .clusters[0].cluster.server )
CLUSTER_TOKEN=$( kubectl config view -o json|jq -r .users[0].user.token )

# 获取删除 finalizers 后的命名空间 json 配置
kubectl get ns ${NAMESPACE} -ojson| \
jq 'del(.spec.finalizers[])'| \
jq 'del(.metadata.finalizers)' > ${NAMESPACE}.json

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${CLUSTER_TOKEN}" \
-X PUT \
--data-binary @${NAMESPACE}.json \
${RANCHER_SERVER_URL}/api/v1/namespaces/${NAMESPACE}/finalize

非 rancher 管理的 k8s 集群

主机上需要安装 jq 和 curl 工具,https://stedolan.github.io/jq/

NAMESPACE='' # 指定需要删除的命名空间
KUBE_CONFIG='' # 指定 K8S 配置文件

K8S_API_URL=$( kubectl --kubeconfig=${KUBE_CONFIG} config view --raw -o json|jq -r '.clusters[0].cluster.server' )

# 注意:如果 config 中证书是以文件保存,此处命令
kubectl --kubeconfig=${KUBE_CONFIG} config view --raw -o json| \
jq -r '.users[0].user."client-certificate-data"'| \
tr -d '"'|base64 --decode > /tmp/client_cert.pem

kubectl --kubeconfig=${KUBE_CONFIG} config view --raw -o json| \
jq -r '.users[0].user."client-key-data"'| \
tr -d '"'|base64 --decode > /tmp/client_key.pem

kubectl --kubeconfig=${KUBE_CONFIG} config view --raw -o json| \
jq -r '.clusters[0].cluster."certificate-authority-data"'| \
tr -d '"'|base64 --decode > /tmp/client_ca.pem

# 获取删除 finalizers 后的命名空间 json 配置
kubectl --kubeconfig=${KUBE_CONFIG} get ns ${NAMESPACE} -ojson| \
jq 'del(.spec.finalizers[])'| \
jq 'del(.metadata.finalizers)' > ${NAMESPACE}.json

curl -k \
--cert /tmp/client_cert.pem \
--key /tmp/client_key.pem \
--cacert /tmp/client_ca.pem \
-H "Content-Type: application/json" \
-X PUT \
--data-binary @${NAMESPACE}.json \
${K8S_API_URL}/api/v1/namespaces/${NAMESPACE}/finalize