【问题标题】:How to force delete a Kubernetes Namespace?如何强制删除 Kubernetes 命名空间?
【发布时间】:2019-09-15 02:58:19
【问题描述】:

如何强制删除卡在 Terminating 中的命名空间?

重建步骤:

  1. 应用此 YAML
apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
  finalizers:
    - foregroundDeletion
  1. kubectl delete ns delete-me

  2. 无法删除delete-me

我发现的唯一解决方法是销毁并重新创建整个集群。

我尝试过的事情:

这些都不起作用或修改命名空间。在其中任何一个之后,有问题的终结器仍然存在。

编辑 YAML 和 kubectl apply

申请:

apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
  finalizers:
$ kubectl apply -f tmp.yaml 

namespace/delete-me configured

命令完成且没有错误,但命名空间未更新。

下面的 YAML 有同样的结果:

apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:

kubectl edit

kubectl edit ns delete-me,并删除终结器。同上完全删除列表。同上删除spec。同样用空列表替换 finalizers

$ kubectl edit ns delete-me 

namespace/delete-me edited

这不会显示错误消息,但不会更新命名空间。 kubectl editing 对象再次显示终结器仍然存在。

kubectl proxy &

  • kubectl proxy &
  • curl -k -H "Content-Type: application/yaml" -X PUT --data-binary @tmp.yaml http://127.0.0.1:8001/api/v1/namespaces/delete-me/finalize

如上,成功退出但什么也不做。

强制删除

kubectl delete ns delete-me --force --grace-period=0

这实际上会导致错误:

warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (Conflict): Operation cannot be fulfilled on namespaces "delete-me": The system is ensuring all content is removed from this namespace.  Upon completion, this namespace will automatically be purged by the system.

然而,它实际上并没有做任何事情。

等一下

在我为调试此问题而设置的测试集群中,我已经等待了一个多星期。即使命名空间最终可能决定被删除,我也需要在一周内将其删除。

确保命名空间为空

命名空间为空。

$ kubectl get -n delete-me all

No resources found.

etcdctl

$ etcdctl --endpoint=http://127.0.0.1:8001 rm /namespaces/delete-me

Error:  0:  () [0]

我很确定这是一个错误,但我不知道如何解释它。它也不起作用。还尝试了--dir-r

ctron/kill-kube-ns

有一个script for force deleting Namespaces。这也不起作用。

$ ./kill-kube-ns delete-me

Killed namespace: delete-me

$ kubectl get ns delete-me 

NAME        STATUS        AGE
delete-me   Terminating   1h

POSTing 编辑的资源到 /finalize

Returns a 405。我不确定这是否是 POST 到 /finalize 的规范方式。

链接

This appears to be a recurring problem and none of these resources helped.

Kubernetes bug

【问题讨论】:

  • 你做对了,但是里面有些东西需要很长时间才能删除。没有办法再强迫它了。只需检查剩下的 kubectl -n <ns> get all -o yaml 可能会为您提供更多信息。
  • 你试过从 etcd 中删除它吗?像 etcdctl rm /namespaces/delete-me ?
  • @MaxLobur 命名空间是空的,在某些情况下,我等待删除的时间已经超过一周。更新帖子。

标签: kubernetes kubernetes-namespace


【解决方案1】:

kubectl proxy 的尝试几乎是正确的,但并不完全正确。可以使用 JSON 而不是 YAML 来解决问题,但我不确定。

具有空终结器列表的 JSON:

~$ cat ns.json

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "delete-me"
  },
  "spec": {
    "finalizers": []
  }
}

使用curlPUT 没有问题终结器的对象。

~$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8007/api/v1/namespaces/delete-me/finalize

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "delete-me",
    "selfLink": "/api/v1/namespaces/delete-me/finalize",
    "uid": "0df02f91-6782-11e9-8beb-42010a800137",
    "resourceVersion": "39047",
    "creationTimestamp": "2019-04-25T17:46:28Z",
    "deletionTimestamp": "2019-04-25T17:46:31Z",
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"delete-me\"},\"spec\":{\"finalizers\":[\"foregroundDeletion\"]}}\n"
    }
  },
  "spec": {

  },
  "status": {
    "phase": "Terminating"
  }
}

命名空间被删除!

~$ kubectl get ns delete-me

Error from server (NotFound): namespaces "delete-me" not found

【讨论】:

  • json 中的小错误。 "name": "delete-me" 结尾不应有逗号。
【解决方案2】:

我喜欢这个摘自here的答案

在一个终端中:

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 @-

【讨论】:

  • 无论我尝试什么,我的服务器都拒绝连接。我的服务器版本是 1.16,我的客户端是 1.19。
【解决方案3】:
kubectl get ns delete-me -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/your-ns/finalize" -f -

【讨论】:

  • 您好,欢迎来到 SO。你应该总是对你的代码做一点解释。
【解决方案4】:

这是对用户Ushakov Roman提供的命令的修改。

namespace=delet_ns && kubectl get ns $namespace  -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 2021-09-12
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2023-02-07
    相关资源
    最近更新 更多