namespace 删除失败问题解决

问题

删除namespace时,一直处于 terminating 状态。无法删除。

$ kubectl delete ns skynet
Error from server (Conflict): Operation cannot be fulfilled on namespaces "skynet": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system. 

$ kubectl describe ns skynet
Name: skynet 
Labels: <none> 
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"skynet","namespace":""}} 

Status: Terminating 

根本原因

namespace删除卡住有很多原因,一般最常见的原因是namespace下有某些资源没有被删除导致namespace删除卡死。

解决方案

常见的有两种处理方案,根据我们的目的可以选择不同方案来删除卡死的namespace

  • 检查和定位namespace删除失败的原因,并手动清空namespace下无法自动删除的资源
  • 移除namespace的finalizers,让 kube-api直接删除namespace

方案1

删除namespace时,如果有些资源无法自动删除,会导致namespace无法删除,所以需要找到不能被删除的资源并手动删除,namespace就会被清理。

  1. 检查定位namespace下没有删除的资源
kubectl api-resources --verbs=list --namespaced -o name | xargs kubectl get -n <namespace>
  1. 检测是否有外部注册的 apiservices 服务无法访问
kubectl get apiservice | grep False

方案2

删除namespace时,如果 namespace 字段 finalizers 不为空,且值是 kubernetes 时,apiserver 服务就会尝试清理该namespace下的所有资源,如果有部分资源无法被清理,则删除过程就会卡住。当把 finalizers 更新为空时,apiserver 就会跳过清理,直接删除namespace。但这种方案会有没有删除的资源遗留在集群。

  1. 获取namespace
$ NAMESPACE=skynet
$ kubectl get ns $NAMESPACE -o json > /tmp/${NAMESPACE}.json
$ cat /tmp/${NAMESPACE}.json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-02-04T16:15:06Z",
"name": "skynet",
"resourceVersion": "20879144",
"selfLink": "/api/v1/namespaces/skynet",
"uid": "0951bcf9-2898-11e9-8e38-0242ac11000b"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
}
  1. 修改 finalizers 字段为空,如下
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-02-04T16:15:06Z",
"name": "skynet",
"resourceVersion": "20879144",
"selfLink": "/api/v1/namespaces/skynet",
"uid": "0951bcf9-2898-11e9-8e38-0242ac11000b"
},
"spec": {
"finalizers": [
]
},
"status": {
"phase": "Active"
}
}
  1. 更新namespace对象
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://kubernetes-cluster-ip/api/v1/namespaces/skynet/finalize
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排错指南 - Pod 本文档介绍 Pod 的异常状态,可能原因和解决办法。 排查 Pod 异常的常用命令如下: 查...
    小孩子的童话2014阅读 7,069评论 0 2
  • 文~火炎 今天上午接了两篇文,中午快速的用语音输入了一下。但是还没有修改,估计明天也需要一两个小时改正。 晚上给两...
    金鱼茵茵阅读 45评论 0 0
  • 又是一次书房大清理,清理到我已经快没有脾气了!只想变成一条咸鱼躺着,都不想动了,因为拖延症犯病并且又被其他事情干扰...
    进击的嘉欣大小姐阅读 138评论 0 0
  • 随着现代人不断追求更高质量的生活及更高品质的居住空间,我们不遗余力,为更多人提供更健康、更宽广、更具人性化的居住空...
    华浔朱晓阅读 589评论 0 1
  • 作者:毛志杰(家长课堂) “咱小宝从小到大没说过谎话”,宝爸从网上看到了一则关于“妈妈将说谎的孩子送派出所”的新闻...
    毛哥说教育阅读 194评论 3 2