Myluzh Blog

K8S 删除命名空间一直卡在Terminating解决方案(移除finalizers,强制删除命名空间)

发布时间: 2025-3-5 文章作者: myluzh 分类名称: Kubernetes 朗读文章


0x01 前言
Kubernetes 命名空间一直处于 Terminating 状态,无法删除。
通常是由于该命名空间中的资源对象被设置了终结器(finalizers)。终结器是一种机制,用于确保某些操作在对象被删除之前完成。例如,某些控制器可能会设置终结器以确保在删除命名空间之前清理相关资源或执行特定的清理逻辑。如果这些清理任务未完成或者出现了错误,命名空间将一直保持在“Terminating”状态。


0x02 解决方案
方案1:排查并解决阻塞资源问题
命名空间无法删除是因为其中包含了一些特殊的资源(如自定义资源定义CRD、持久卷声明PVC等),这些资源的存在阻止了命名空间的删除过程。检查命名空间下的所有资源:根据输出结果逐一排查是否有异常资源未被正确清理,并采取相应措施(如手动删除资源)。
# 列出指定命名空间中所有类型的资源
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>

方案2:移除命名空间中的 finalizers
此方法通过直接编辑命名空间的定义来移除所有终结器,从而强制删除命名空间。虽然简单直接,但需要注意的是,这样做可能会跳过一些必要的清理工作,因此请谨慎使用。
# 清除某个命名空间的finalizers
kubectl patch namespace --patch '{"metadata": {"finalizers": null}}'

# 获取所有状态为Terminating的ns,然后移除ns中的finalizers
kubectl get ns | grep Terminating | awk '{print $1}' | xargs -I {} kubectl patch namespace {} -p '{"metadata":{"finalizers":[]}}' --type=merge

方案3:通过API移除finalizers
这种方法利用了Kubernetes API的能力,通过发送HTTP请求的方式绕过CLI工具限制来移除终结器。它适用于那些因为各种原因导致无法正常通过CLI进行操作的情况。
# 启动 kubectl 代理
kubectl proxy &

# 获取代理进程的 PID
proxy_pid=$!

# 等待几秒钟以确保代理启动完成
sleep 5

# 发送 PUT 请求以移除 finalizers,并指定 Content-Type 为 application/json
curl -X PUT \
     -H "Content-Type: application/json" \
     --data-binary @- \
     http://127.0.0.1:8001/api/v1/namespaces/my_ns_name/finalize <<EOF
{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "my_ns_name",
    "finalizers": []
  }
}
EOF

# 关闭 kubectl 代理
kill $proxy_pid

标签: k8s kubernetes Namespace ns terminating finalizers


正文到此结束
版权声明:若无特殊注明,本文皆为 Myluzh Blog 原创,转载请保留文章出处。
文章内容:https://itho.cn/k8s/494.html
文章标题:《K8S 删除命名空间一直卡在Terminating解决方案(移除finalizers,强制删除命名空间)

发表评论