开发者社区> 问答> 正文

如何删除处于终止状态的命名空间?

如何删除处于终止状态的命名空间?

展开
收起
小天使爱美 2020-03-20 20:25:26 1112 0
1 条回答
写回答
取消 提交回答
  • 尝试删除 Kubernetes 命名空间后,长时间停留在终止状态。 本文介绍如何解决命名空间处于终止状态的问题。

    问题现象 尝试删除 Kubernetes 命名空间后,长时间停留在终止状态。 $ kubectl delete ns Error from server (Conflict): Operation cannot be fulfilled on namespaces " ": 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 Name: Labels: Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":" ","namespace":""}}

    Status: Terminating 可能原因 通常是因为从集群中删除的这些命名空间下存在资源。

    解决方案 选项 1:识别并手动删除无法自动删除的资源。

    此选项不太直接,但在大多数情况下可能是更好的解决方案。因为删除命名空间后,它不会将该命名空间下的资源保留在集群中。

    检查没有自动删除的命名空间资源。 尝试删除命名空间后,某些资源可能尚未删除。如果可以识别并手动删除所有剩余资源,则命名空间将终止。 kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n 检查所有不可用且不提供资源的 API Service。 kubectl get apiservice | grep False 选项 2:删除命名空间的 finalizers。

    该选项将会快速清除处于终止状态的命名空间,但可能会导致属于该命名空间的资源留在集群中,因为无法自动删除它们。在 finalizers 数组为空并且状态为终止之后,Kubernetes 将删除命名空间。

    打开 shell 终端,为您的 Kubernetes 集群创建一个反向代理。 kubectl proxy 输出示例如下: Starting to serve on 127.0.0.1:8001 打开一个新的 shell 终端,通过定义环境变量来连接到 Kubernetes 集群,使用 cURL 测试连接性和授权。 export TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t') curl http://localhost:8001/api/v1/namespaces --header "Authorization: Bearer $TOKEN" --insecure 获取命名空间定义的内容。 kubectl get namespace -o json > .json 将 finalizers 数组置为空,并重新保存文件。 "spec": { "finalizers": [ ] }, 执行以下命令去除 finalizers。 curl -X PUT --data-binary @ .json http://localhost:8001/api/v1/namespaces/logging/finalize

    2020-03-20 20:25:50
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载