如何强制删除Kubernetes命名空间?

Wil*_*son 6 kubernetes kubernetes-namespace

如何强制删除停留在终止中的命名空间?

重建步骤:

  1. 应用此YAML
apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
  finalizers:
    - foregroundDeletion
Run Code Online (Sandbox Code Playgroud)
  1. kubectl delete ns delete-me

  2. 无法删除delete-me

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

我尝试过的事情:

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

编辑YAML并 kubectl apply

应用:

apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
  finalizers:
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f tmp.yaml 

namespace/delete-me configured
Run Code Online (Sandbox Code Playgroud)

该命令无错误地结束,但是名称空间未删除。

下面的YAML具有相同的结果:

apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
Run Code Online (Sandbox Code Playgroud)

kubectl edit

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

$ kubectl edit ns delete-me 

namespace/delete-me edited
Run Code Online (Sandbox Code Playgroud)

这不会显示任何错误信息,但不会更新命名空间。kubectl edit再次查看该对象将显示终结器仍然存在。

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.
Run Code Online (Sandbox Code Playgroud)

但是,它实际上没有任何作用。

等了好久

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

确保命名空间为空

命名空间为空。

$ kubectl get -n delete-me all

No resources found.
Run Code Online (Sandbox Code Playgroud)

etcdctl

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

Error:  0:  () [0]
Run Code Online (Sandbox Code Playgroud)

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

ctron/kill-kube-ns

有一个用于强制删除命名空间脚本。这也不起作用。

$ ./kill-kube-ns delete-me

Killed namespace: delete-me

$ kubectl get ns delete-me 

NAME        STATUS        AGE
delete-me   Terminating   1h
Run Code Online (Sandbox Code Playgroud)

POST将编辑的资源/ finalize

返回405。我不确定这是否是POST到/ finalize的规范方法。

链接

似乎 成为 一个 反复出现的 问题 ,并 没有任何 这些 资源 帮助

Kubernetes错误

小智 22

将 Termination 中出现的两次 替换<NAME_OF_NAMESPACE>为命名空间的实际名称后应用此命令可以解决该问题:

kubectl get ns <NAME_OF_NAMESPACE> -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/<NAME_OF_NAMESPACE>/finalize" -f -
Run Code Online (Sandbox Code Playgroud)

解释:

大多数回复似乎都在做同样的事情;从命名空间中删除终结器。在本例中,分三步完成:

  1. kubectl get ns <NAME_OF_NAMESPACE> -o json以 json 格式返回命名空间配置。这将通过管道传输到下一个命令中:
  2. jq '.spec.finalizers = []'从 json 配置中删除所有终结器。然后将生成的 json(不带终结器)通过管道传输到下一个命令:
  3. kubectl replace --raw "/api/v1/namespaces/<NAME_OF_NAMESPACE>/finalize" -f -,将更新后的 json 命名空间配置(不带终结器)注入到 k8s 中。

  • 您好,欢迎来到SO。您应该始终对您的代码进行一些解释。 (2认同)

dbu*_*osp 18

我喜欢从这里提取的这个答案

在一个终端中:

kubectl proxy
Run Code Online (Sandbox Code Playgroud)

在另一个终端:

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 @-
Run Code Online (Sandbox Code Playgroud)


小智 15

这里是对用户Ushakov Roman提供的命令的修改(详细解释参见那里)。与 Ushakov Roman 的解决方案相比,namespace在开头定义变量有助于减少实际需要键入名称空间名称的位置数量:

namespace=<NAME_OF_NAMESPACE> && kubectl get ns $namespace  -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -
Run Code Online (Sandbox Code Playgroud)


Wil*_*son 5

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

终结符列表为空的JSON:

~$ cat ns.json

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "delete-me",
    "selfLink": "/api/v1/namespaces/delete-me",
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"delete-me\"},\"spec\":{\"finalizers\":[\"foregroundDeletion\"]}}\n"
    }
  },
  "spec": {
    "finalizers": [
    ]
  },
  "status": {
    "phase": "Terminating"
  }
}
Run Code Online (Sandbox Code Playgroud)

使用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"
  }
}
Run Code Online (Sandbox Code Playgroud)

命名空间已删除!

~$ kubectl get ns delete-me

Error from server (NotFound): namespaces "delete-me" not found
Run Code Online (Sandbox Code Playgroud)

  • json 中的小错误。`"name": "delete-me" ` 末尾不应有逗号。 (3认同)