一、K8S的namespace一直处于terminating状态怎么办?
目前公司使用的k8s版本是v1.18.2,由于规定将namespace命名为项目名称,故:将不规范的namespace做了修改,由于是一个小项目在变更日做了如下修改,使用粗暴的方式:
`[root@k8s-master1 ~]``#kubectl delete namespace gf-prod``[root@k8s-master1 ~]``# kubectl get ns``NAME STATUS AGE``aammini Active 353d``cattle-impersonation-system Active 150d``cattle-system Active 150d``default Active 2y10d``gf-prod Terminating 62d 异常状态`
1、方法一
# 第一种办法:
[root@master01 ~]# kubectl delete namespace <terminating-namespace>
# 第二种方法:
首先可以尝试使用–force --grace-period=0 参数强制删除
[root@master01 ~]# kubectl delete namespace <terminating-namespace> --force --grace-period=0
但是在某些情况下,即使命名空间下没有运行的资源,但依然无法删除Terminating状态的命名空间的情况,它会一直卡在Terminating状态下,即使用–force --grace-period=0 也删除不了。
2、方法二
# patch命令
[root@master01 ~]# kubectl patch ns/<terminating-namespace> -p '{"metadata":{"finalizers":[]}}' --type=merge
同理其它资源也可以
kubectl patch crd/ -p '{"metadata":{"finalizers":[]}}' --type=merge
先导出json的方法
# 导出namespace配置保存为json文件
kubectl get namespace <terminating-namespace> -o json >tmp.json
#编辑这个json文件,删除finalizers 字段为kubernetes 的值,编辑完这部分的值如下。
#编辑之前
"spec": {
"finalizers": [
"kubernetes"
]
},
#编辑之后
"spec": {
"finalizers": [
]
},
#启动一个临时的proxy
#kubectl proxy
Starting to serve on 127.0.0.1:8001
# 通过将json文件PUT 到API 修改配置
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize
#删除spec及status部分的内容还有metadata字段后的","号,切记!
"spec": {
},
至此,这个状态一直处于terminating 的namespace 应该是被删除了。验证 kubectl get namespaces
3、方法三
# 1、直接修改etcd(删除前先备份etcd)
删除terminating-namespace
[root@master01 ~]# etcdctl del /registry/namespaces/<terminating-namespace>
4、方法四
(1)尝试了强制删除 kubectl delete namespace [namespace] --force --grace-period=0 和通过接口删除不怎么好使,下来有时间再做详细研究。
(2)直接问我们公司大佬,平常在工作中帮

文章介绍了当K8S的namespace处于terminating状态时的四种解决方法,包括使用kubectl命令强制删除、通过patch命令修改finalizers、直接编辑etcd以及通过kubectl的raw接口清除finalizers。这些方法用于处理命名空间无法正常删除的情况。
最低0.47元/天 解锁文章
826

被折叠的 条评论
为什么被折叠?



