k8s删除Terminating状态的命名空间
问题描述
Kubernetes中namespace有两种常见的状态,即Active和Terminating状态,其中Terminating状态一般会比较少见,当对应的命名空间下还存在运行的资源,但该命名空间被删除时才会出现所谓的Terminating状态,这种情况下只要等待Kubernetes本身将命名空间下的资源回收后,该命名空间将会被系统自动删除。
但是在某些情况下,即使命名空间下没有运行的资源,但依然无法删除Terminating状态的命名空间的情况,它会一直卡在Terminating状态下。
问题解决
1、查看命名空间详情
kubectl get ns |grep ingress-nginx-2
2、查看该命名空间下的资源
# 查看集群中可以使用命名空间隔离的资源 kubectl api-resources -o name --verbs=list --namespaced | xargs -n 1 kubectl get --show-kind --ignore-not-found -n ingress-nginx-2
发现ingress-nginx-2命名空间下并无资源占用。
3、尝试对命名空间进行删除
直接删除命名空间ingress-nginx-2
kubectl delete ns ingress-nginx-2
未能正常删除
4、使用强制删除
kubectl delete ns ingress-nginx-2 --force --grace-period=0
依然无法删除该命名空间
5、使用原生接口删除
大部分情况下删除不掉资源,需要使用原生接口删除。获取namespace的详情信息
kubectl get ns ingress-nginx-2 -o json > ingress-nginx-2.json
查看namespace定义的json配置,编辑json文件并删除掉spec部分。
vim ingress-nginx-2.json
如果仍然无法删除命名空间,请查看metadata部分是否存在finalizers字段,如果存在,需要通过如下命令进入命名空间后删除该字段:
kubectl edit ns ingress-nginx-2
使用kubectl代理,执行命令
kubectl proxy --port=8080
使用一下命令进行测试
curl http://localhost:8080/api/
输出类似如下内容
使用http接口进行删除
curl -k -H "Content-Type: application/json" -X PUT --data-binary @xx.json http://127.0.0.1:8080/api/v1/namespaces/命名空间的名字/finalize
再次查看,成功删除