https://github.com/kubernetes/kubernetes/issues/60807
https://kb.kasten.io/knowledge/how-to-debug-namespaces-that-are-stuck-terminating
Что делать, если неймспейс при удалении завис в состоянии Terminating?
- Нужно попытаться отредактировать его и удалить finalizers (в том числе и из спецификации). Например так:
kubectl patch ns BAD_NAMESPACE -p '{"metadata":{"finalizers":null}}'
- Если это не помогло (finalizers вернулись а место после удаления), то нужно сделать так:
kubectl get namespace BAD_NAMESPACE -o json > tmp.json
Отредактировать файлик tmp.json, удалив из него finalizers, а затем применить его.
Для этого - проксируем API на локальный порт:
sudo -E kubectl proxy --port=8080
И затем финализируем удаление неймспейса:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://localhost:8080/api/v1/namespaces/BAD_NAMESPACE/finalize
Однако, если и после этого неймспейс не удалится, то нужно посмотреть на вывод этой команды. Там могут быть сообщения вида:
"status": { "phase": "Terminating", "conditions": [ { "type": "NamespaceDeletionDiscoveryFailure", "status": "True", "lastTransitionTime": "2021-10-21T19:59:35Z", "reason": "DiscoveryFailed", "message": "Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request" }, ...
Что означает, что не работают какие-то сервисы API. Для того, чтобы исправить - просто удаляем заклинивший сервис API:
kubectl delete apiservice v1beta1.metrics.k8s.io
И дальше - повторяем curl…
В самом крайнем случае - можно попробывать ЖЕСТКО перезаупстить все контейнеры кубера:
systemctl stop kubelet.service for item in `ctr -n k8s.io tasks ls | awk '{print $1}'`; do ctr -n k8s.io tasks kill $item; done for item in `ctr -n k8s.io containers ls | awk '{print $1}'`; do ctr -n k8s.io containers rm $item; done ctr -n k8s.io tasks ls ctr -n k8s.io containers ls systemctl start kubelet.service
Discussion