Как заставить удалить пространство имен Kubernetes? - PullRequest
4 голосов
/ 25 апреля 2019

Как заставить принудительно удалить пространства имен, застрявшие в завершении?

Шаги для воссоздания:

  1. Применить этот YAML
apiVersion: v1
kind: Namespace
metadata:
  name: delete-me
spec:
  finalizers:
    - foregroundDeletion

kubectl delete ns delete-me

Невозможно удалить 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

Существует сценарий для принудительного удаления пространств имен .Это также не работает.

$ ./kill-kube-ns delete-me

Killed namespace: delete-me

$ kubectl get ns delete-me 

NAME        STATUS        AGE
delete-me   Terminating   1h

POST при редактировании отредактированного ресурса в / finalize

Возвращает 405 .Я не уверен, что это канонический способ POST / финализации.

Ссылки

Этот появляется в be a повторяющиеся проблемы и нет из эти ресурсы помогли .

ошибка Kubernetes

1 Ответ

2 голосов
/ 26 апреля 2019

Попытка 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"
  }
}

Используйте 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"
  }
}

Пространство имен удалено!

~$ kubectl get ns delete-me

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