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

时间:2019-04-25 15:56:15

标签: kubernetes kubernetes-namespace

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

重新创建步骤:

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

但是,它实际上什么也没做。

等待很长时间

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

确保命名空间为空

命名空间为空。

$ 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

POST将已编辑的资源/ finalize

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

链接

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

Kubernetes bug

2 个答案:

答案 0 :(得分:6)

我喜欢从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 :(得分:1)

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

终结符列表为空的JSON:

kubectl proxy

使用~$ 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" } } curl对象,而不会遇到有问题的终结器。

PUT

命名空间已删除!

~$ 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"
  }
}