NameSpaces状态一直为Terminating
问题描述
删除ingress-nginx后发现ingress-nginx的命名空间一直为销毁中,大致查看了下发现命名空间中已经没有其他资源。
该状态已经持续了十几个小时
强制删除命名空间
```Plain Text kubectl delete --force ns ingress-nginx
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112090945022.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112090945022.png) 可以发现强制删除ns也是不行的,执行会在这里卡很久 # 编辑删除 强制删除也无效时我们可以进行编辑删除
Plain Text kubectl edit ns ingress-nginx
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202209291627121.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202209291627121.png) 将其中finalizers字段设置为`[]` ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112090952947.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112090952947.png) 保存后再次进行删除
Plain Text kubectl delete ns --force ingress-nginx
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112090958532.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112090958532.png) 这里删除报错,先不去深究原因,试一下另一种删除方式 # 调用API进行删除 首先将该namespces的配置导出
Plain Text kubectl get ns ingress-nginx -o json > tmp.json
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091000992.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091000992.png) 编辑导出的配置文件
Plain Text vim tmp.json
删除`spec`和`status`的部分 ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091002397.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091002397.png) 删除后如下 ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091003555.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091003555.png) 启动代理
Plain Text kubectl proxy
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091005131.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091005131.png) 此时代理启动在本机的8001端口 调用api进行删除
Plain Text curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/ingress-nginx/finalize
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091010754.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202112091010754.png) 再次查看namespaces
Plain Text kubectl get ns
```
依旧没有被删除
研究下编辑删除中的finalizers字段
Finalizers
Finalizers 字段属于 Kubernetes GC 垃圾收集器,是一种删除拦截机制,能够让控制器实现异步的删除前(Pre-delete)回调。其存在于任何一个资源对象的 Meta[1] 中,在 k8s 源码中声明为 []string
,该 Slice 的内容为需要执行的拦截器名称。
对带有 Finalizer 的对象的第一个删除请求会为其 metadata.deletionTimestamp
设置一个值,但不会真的删除对象。一旦此值被设置,finalizers 列表中的值就只能被移除。
当 metadata.deletionTimestamp
字段被设置时,负责监测该对象的各个控制器会通过轮询对该对象的更新请求来执行它们所要处理的所有 Finalizer。当所有 Finalizer 都被执行过,资源被删除。
metadata.deletionGracePeriodSeconds
的取值控制对更新的轮询周期。
每个控制器要负责将其 Finalizer 从列表中去除。
每执行完一个就从 finalizers
中移除一个,直到 finalizers
为空,之后其宿主资源才会被真正的删除。
这里我们可以看到需要finalizers为空时,才会删除资源。而我们ns的列表不为空,所以无法被真正删除。再次查看下ns的配置。
可以看到是由于rancher导致的,此时我们删除rancher所在命名空间(之前已经删除过rancher),发现同样问题。
编辑ns的配置文件
删除finalizers字段的内容后,namespaces被删除。