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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐