Есть ли у вас пространство имен в кластере Kubernetes, застрявшее в состоянии «Завершение работы» состояние? Когда пространство имен застревает в этом состоянии, это обычно означает, что Kubernetes не удалось очистить ресурсы в этом пространстве имен. Основная причина — финализаторы или ресурсы не очищены должным образом или застряли. См. пример ниже:
$ kubectl get ns
NAME STATUS AGE
calico-apiserver Active 4d13h
calico-system Active 4d13h
default Active 4d13h
kube-node-lease Active 4d13h
kube-public Active 4d13h
kube-system Active 4d13h
longhorn-system Terminating 18m
tigera-operator Active 4d13h
Я могу подтвердить, что капсулы и другие ресурсы удалены, но состояние остается «Завершение работы«. Рассмотрим несколько способов принудительного удаления пространства имен в Kubernetes.
Установить имя застрявшего пространства имен в NS переменная.
NS=longhorn-system
Прежде чем принудительно удалять пространство имен, проверьте, нет ли в нем неиспользуемых ресурсов, которые могут вызывать проблемы:
kubectl get all --namespace=$NS
1. Снятие финализаторов вручную
Если в пространстве имен финализаторы не удаляются должным образом, оно может застрять в «завершение» состояние. Вы можете отредактировать yaml-файл объекта пространства имен:
kubectl edit namespace $NS
В редакторе найдите finalizers
поле и удалите его, выполнив следующие настройки:
finalizers: []
2. Принудительное удаление с помощью kubectl
Если первый вариант не принес успеха, вы можете принудительно удалить пространство имен с помощью патча.
Принудительное удаление застрявшего пространства имен в kubernetes.
kubectl get $NS -o json | jq '.spec.finalizers=[]' | kubectl replace --raw "/api/v1/ $NS/longhorn-system/finalize" -f -
Примечание: jq
должен быть установлен, чтобы вы могли модифицировать вывод JSON. Имейте в виду, что этот метод обходит финализаторы.
3. Принудительно удалите пространство имен
--grace-period=0
и --force
флаги могут быть использованы для принудительного удаления пространства имен в Kubernetes. Однако этот метод может оставить осиротевшие ресурсы, поэтому его следует использовать с осторожностью:
kubectl delete namespace $NS --grace-period=0 --force
Убедиться в том, что пространство имен было удалено, можно, выполнив команду:
kubectl get $NS
Приведенный ниже результат показывает, что оно не существует:
error: the server doesn't have a resource type "longhorn-system"