1. 问题描述
因同事操作失误删除了ingress-nginx命名空间,却一直卡在删除中,状态一直是 Terminating
2. 解决方法
2.1 方法一:强制删除
kubectl delete ns ingress-nginx --force --grace-period=0
如删除不掉还是 Terminating
2.2 方法一:调用api servie 删除
kubectl get namespace ingress-nginx -o json > ingress-nginx-ns.json
编辑文件删除其中的spec字段,因为k8s集群是携带认证的
vim ingress-nginx-ns.json
然后调用api进行删除
可以通过 kubectl proxy 设置 APIServer 的临时 IP 和端口
kubectl proxy --port=8088
另起一个终端调用api 临时端口删除
curl -k -H "Content-Type:application/json" -X PUT --data-binary @ingress-nginx-ns.json http://127.0.0.1:8088/api/v1/namespaces/ingress-nginx/finalize
命令解释
curl -k -H "Content-Type:application/json" -X PUT --data-binary @{编辑的json文件} http://127.0.0.1:8081/api/v1/namespaces/命名空间名称/finalize
如还是删除不掉,还是 Terminating
2.3 方法三: etcd数据库删除
2.3.1问题分析:
删除命名空间是kubectl 向apiserver 发送请求删除命名空间, apiserver再把删除操作发送给etcd ,apisever 等待etcd 删除该命名空间。 现结合该流程,我们怀疑是暴力删除命名空间时没有清空命名空间下的资源,导致无法删除命名空间。
现在开始在ETCD数据库中直接删除该命名空间,删除Terminating 的命名空间
2.3.2先查看命名空间
etcdctl get / --prefix --keys-only |grep /registry/namespaces/ #找到要删除的命名空间
2.3.3 删除
etcdctl del /registry/namespaces/ingress-nginx
如执行etcdctl需要证书,参考一下命令
export ETCDCTL_API=3
alias edctl ='etcdctl --endpoints=192.168.1.15:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/apiserver-etcd-client.crt --key=/etc/kubernetes/pki/apiserver-etcd-client.key'
查看
edctl get / --prefix --keys-only |grep /registry/namespaces/
删除
edctl del /registry/namespaces/ingress-nginx
3. 总结经验:
通过上述分析得到,我们在删除命名空间之前要先清理该命名空间下的资源后再进行操作