我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。


当前回答

这里有一个(又一个)解决方案。它使用jq从json中移除finalisers块,并且不需要kubectl代理:

namespaceToDelete=blah

kubectl get namespace "$namespaceToDelete" -o json \
  | jq 'del(.spec.finalizers)' \
  | kubectl replace --raw /api/v1/namespaces/$namespaceToDelete/finalize -f -

其他回答

这是由于名称空间控制器无法删除名称空间中仍然存在的资源。

这个命令(使用kubectl 1.11+)将显示名称空间中保留的资源:

kubectl api-resources --verbs=list --namespaced -o name \
  | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>

一旦找到并解析并删除这些名称空间,该名称空间就会被清理

类似的事情发生在我身上,在我的情况下,它是pv & pvc,我通过将终结器设置为null强行删除。看看你是否可以用ns做类似的事情

kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'

对于名称空间来说是这样

kubectl patch ns <ns-name> -p '{"spec":{"finalizers":null}}'

正如之前在这个线程中提到的,还有另一种方法可以使用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 -

在我的案例中,问题是由自定义指标引起的。

要了解导致问题的原因,只需运行以下命令:

kubectl api-resources | grep -i false

这将告诉您是哪些api资源导致了问题。一旦识别出来,就删除它:

kubectl delete apiservice v1beta1.custom.metrics.k8s.io

一旦删除,命名空间就会消失。

编辑: 不建议删除终结器。 正确的做法是:

删除命名空间下的所有资源。

Github问题链接

我通常的工作空间是一个小的k8s集群,我经常破坏并重新构建它,这就是为什么删除终结器方法适合我。

原来的答案:我经常遇到同样的问题。

这就是我的工作

kubectl get ns your-namespace -o json > ns-without-finalizers.json

编辑ns-without-finalizers.json。将所有终结器替换为空数组。

运行kubectl代理(通常在另一个终端上运行)

然后curl这个命令

curl -X PUT http://localhost:8001/api/v1/namespaces/your-namespace/finalize -H "Content-Type: application/json" --data @ns-without-finalizers.json