我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。
当前回答
调试类似的问题。
有两件重要的事情需要考虑:
1)在从命名空间中删除终结器之前要三思,因为可能有一些资源您不想自动删除,或者至少要了解为了排除故障而删除了哪些资源。
2)像kubectl api-resources——verbs=list这样的命令可能不会提供由外部crds创建的资源。
在我的例子中:
我用kubectl编辑ns <ns-name>,在状态->条件下,我看到我安装的一些外部crds未能被删除,因为它们添加了定义的终结器:
- lastTransitionTime: "2021-06-14T11:14:47Z"
message: 'Some content in the namespace has finalizers remaining: finalizer.stackinstall.crossplane.io
in 1 resource instances, finalizer.stacks.crossplane.io in 1 resource instances'
reason: SomeFinalizersRemain
status: "True"
type: NamespaceFinalizersRemaining
其他回答
我发现删除“终止”名称空间的唯一方法是删除“终结器”部分中的条目。我试过——强制删除它和——grace-period=0没有一个工作,但是,这个方法做到了:
在命令行中显示命名空间的信息:
$ kubectl get namespace your-rogue-namespace -o yaml
这将给你yaml输出,寻找类似于这样的一行:
deletionTimestamp: 2018-09-17T13:00:10Z
finalizers:
- Whatever content it might be here...
labels:
然后只需编辑名称空间配置并删除终结器容器中的项。
$ kubectl edit namespace your-rogue-namespace
这将打开一个编辑器(在我的例子中是VI),浏览我想删除的行并删除它,我按D键两次删除整行。
保存它,退出编辑器,就像变魔术一样。rogue-namespace应该消失了。
为了证实这一点:
$ kubectl get namespace your-rogue-namespace -o yaml
强制删除名称空间或删除终结器绝对不是正确的方法,因为这可能会使资源注册到一个不存在的名称空间。
这通常很好,但有一天您将无法创建资源,因为它仍然在某个地方徘徊。
即将发布的Kubernetes 1.16版本应该会对名称空间终结器有更多的了解,目前我将依赖于标识策略。 一个很酷的脚本试图自动化这些是:https://github.com/thyarles/knsk
然而,它可以跨所有名称空间工作,这可能是危险的。它的解决方案是:https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920
博士tl;
检查是否有apiservice不可用,因此没有服务它的资源:kubectl get apiservice|grep False 通过kubectl api-resources——verbs=list——namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete查找所有仍然存在的资源
(来源:https://github.com/kubernetes/kubernetes/issues/60807 # issuecomment - 524772920)
我喜欢这个答案 它只有两个命令。
在一个终端:
kubectl proxy
在另一个终端:
kubectl get ns delete-me -o json | \
jq '.spec.finalizers=[]' | \
curl -X PUT http://localhost:8001/api/v1/namespaces/delete-me/finalize -H "Content-Type: application/json" --data @-
这是由于名称空间控制器无法删除名称空间中仍然存在的资源。
这个命令(使用kubectl 1.11+)将显示名称空间中保留的资源:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
一旦找到并解析并删除这些名称空间,该名称空间就会被清理
正如之前在这个线程中提到的,还有另一种方法可以使用kubectl没有公开的API来终止名称空间,即使用kubectl的现代版本,其中kubectl replace——raw可用(不确定从哪个版本)。通过这种方式,您将不必生成kubectl代理进程,并避免与curl的依赖(在一些环境中,如busybox是不可用的)。为了帮助其他人,我在这里留下了这个:
kubectl get namespace "stucked-namespace" -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
推荐文章
- Kubernetes支持多个环境(Staging、QA、生产等)
- CSS中*和*|*的区别是什么?
- Kubernetes API -获取特定节点上的pod
- 我如何调试“ImagePullBackOff”?
- Django:“projects”vs“apps”
- 在Kubernetes中更新configmap时重新启动pod ?
- 输入对象的datetime。Datetime没有Datetime属性
- 为部署的Kubernetes服务获取YAML ?
- 如何在kubernetes中切换命名空间
- \(反斜杠)在PHP(5.3+)中做什么?
- 位于另一个名称空间中的服务
- 命名空间“卡住”作为终止,我如何删除它
- Kubernetes如何使部署更新映像
- 如何在c++中正确使用名称空间?
- 如何在gcloud和minikube之间切换kubectl集群