Есть ли у вас пространство имен в кластере 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"