k8s删除处于Terminating状态的ns

逆水行舟用力撑,一篙松劲退千寻。这篇文章主要讲述k8s删除处于Terminating状态的ns相关的知识,希望能为你提供帮助。
经常遇到删除ns资源时,长时间处于Terminating状态,
并且使用参数: --force grace-period=0 强制删除无效!
解决办法就是将资源内的finalizers字段删除。

  • 类似这种情况
# kubectl get ns
NAMESTATUSAGE
defaultActive226d
ingress-nginxActive22h
kube-node-leaseActive226d
kube-publicActive226d
kube-systemActive226d
monitoringActive50d
testTerminating40s

  • 执行下边命令
# 定义变量
NAMESPACE=test
# proxy后台监听8001
kubectl proxy &
# jq将spec字段内改为空,主要是删除finalizers字段
kubectl get namespace $NAMESPACE -o json |jq .spec => temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize

Finalizers:
Finalizers 字段属于 Kubernetes GC 垃圾收集器,是一种删除拦截机制,能够让控制器实现异步的删除前(Pre-delete)回调。其存在于任何一个资源对象的 Meta中,在 k8s 源码中声明为 ??[]string??,该 Slice 的内容为需要执行的拦截器名称。
对带有 Finalizer 的对象的第一个删除请求会为其 ??metadata.deletionTimestamp:删除的time?? 设置一个值,当 ??metadata.deletionTimestamp? 字段被设置时,负责监测该对象的各个控制器会通过轮询对该对象的更新请求来执行它们所要处理的所有 Finalizer。
【k8s删除处于Terminating状态的ns】每执行完一个就从 ??finalizers?? 中移除一个,直到 ??finalizers?? 为空,之后其宿主资源才会被真正的删除。

    推荐阅读