K8S 删除namespace 一直 terminating 问题的解决方案

3,590 阅读2分钟

K8S 删除namespace 一直 terminating 问题的解决方案

k8s中namespace有两种常见的状态,即Active和Terminating状态,其中Terminating状态一般会比较少见,当对应的命名空间下还存在运行的资源,但该命名空间被删除时才会出现Terminating状态,这种情况下只要等待k8s本身将命名空间下的资源回收后,该命名空间将会被系统自动删除。但有时命名空间一直处于Terminating,无法删除。

以下介绍三种方法,推荐优先级由高到底,风险由低到高。

第一种办法:

首先可以尝试使用–force --grace-period=0 参数强制删除

kubectl delete namespace  <terminating-namespace> --force --grace-period=0

但是在某些情况下,即使命名空间下没有运行的资源,但依然无法删除Terminating状态的命名空间的情况,它会一直卡在Terminating状态下,即使用–force --grace-period=0 也删除不了。

第二种方法:

直接命令patch

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
#命令执行的返回结果中finalizers参数应该是被删除了:

  "spec": {
    
  },

至此,这个状态一直处于terminating 的namespace 应该是被删除了。验证 kubectl get namespaces

第三种方法:直接修改etcd(删除前先备份etcd)

删除terminating-namespace

etcdctl del /registry/namespaces/<terminating-namespace>

本文由博客一文多发平台 OpenWrite 发布!