k8s的命名空间删除失败-Terminating (有脚本一键删除)
k8s Terminating 删除失败
·
k8s Terminating 删除失败 (有脚本一键删除)
场景:
删除helm-study命名空间失败,状态Terminating。
最下面有删除脚本
一、通过修改文件删除
1)通过正常删除的命令,发现一直挂在这里。
[root@k8s-master01 ingress-nginx]# kubectl delete ns ingress-nginx
namespace "ingress-nginx" deleted
^C
2)查看命名空间状态,状态为Terminating。
[root@k8s-master01 ingress-nginx]# kubectl get ns ingress-nginx
NAME STATUS AGE
ingress-nginx Terminating 3h54m
3)通过 -ojson 将 “helm-study” 的命名空间导为 json 配置文件。
[root@k8s-master01 ingress-nginx]# kubectl get ns ingress-nginx -ojson >ingress-nginx.json
4)编辑 json 文件,删除其中的 spec.finalizers 字段。
修改前
修改后
5)另启一个终端,开启 kubectl 代理。
[root@k8s-master01 calico]# kubectl proxy --port=8089
6)调用 apiserver 接口直接修改命名空间配置。
命令中的端口是步骤5开放出来的端口。
curl -k -H "Content-Type: application/json" -X PUT --data-binary @编辑过的json文件 http://127.0.0.1:8089/api/v1/namespaces/命名空间的名字/finalize
这里的端口要和步骤5定义的端口一
7)检查命名空间是否删除。
[root@k8s-master01 ingress-nginx]# kubectl get ns
NAME STATUS AGE
default Active 109d
elk Active 21d
ingress-nginx2 Active 56d
kube-node-lease Active 109d
kube-public Active 109d
kube-system Active 109d
kubernetes-dashboard Active 109d
monitoring Active 106d
spring-boot Active 3d22h
8)切换到步骤5 的终端 ,ctrl + c 退出。
二、通过命令删除
kubectl delete pods --grace-period=0 --force
kubectl delete -n --grace-period=0 --force
三、脚本删除
脚本一
#!/bin/bash
#找到命名空间中处于 Terminating 状态的命名空间
del_list=`kubectl get ns | grep Ter |awk '{print $1}'`
#定义一个环境变量的端口
p=8038
#启动proxy 监听端口8038,并让其后台运行(指定一个不被占用的端口即可)
kubectl proxy --port=$p &
#删除Terminating 状态的命名空间(注意:这里调用的端口要和上面的一致)
for ns in `echo $del_list`
do
kubectl get namespace $ns -o json > tmp.json
xx=`grep -n -A 2 '"finalizers":' tmp.json | cut -d ":" -f 1 | cut -d "-" -f 1 | awk '{print $1}'`
sed -i "${xx:0:2},${xx: -2}d" tmp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:$p/api/v1/namespaces/$ns/finalize
rm -rf tmp.json
done
#干掉后台运行的proxy
result_pids=`ps -ef |grep "port=$p" |grep -v grep|awk '{print $2}'`
if [ ! -z "$result_pids" ];then
for pids in `echo "$result_pids"`
do
echo "kill pid $pids"
kill -9 $pids
done
fi
脚本二
NAMESPACE=`kubectl get ns | grep Ter |awk '{print $1}'`
for i in $NAMESPACE
do
kubectl get namespace $i -o json | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" | kubectl replace --raw "/api/v1/namespaces/$i/finalize" -f -
done
更多推荐
已为社区贡献1条内容
所有评论(0)