1. Введение
2. Отладка застрявшего пространства имен
$ kubectl get ns <namespace>
Для получения подробного вывода мы добавим флаг -o вместе с форматом вывода:
$ kubectl get ns <namespace> -o yaml
Мы обратим внимание на поле conditions в выводе, поскольку оно может подсказать нам причину проблемы.
Но если это не поможет, мы перечислим все ресурсы в пространстве имен:
$ kubectl api-resources --verbs=list --namespaced=true -o name \
| xargs -n 1 kubectl get --ignore-not-found --show-kind -n <namespace>
Если мы обнаружим зависший ресурс в пространстве имен, то первой попыткой решить проблему будет попытка удалить этот ресурс.
Однако если в пространстве имен нет ресурса, мы можем проверить наличие событий в пространстве имен с помощью kubectl events:
$ kubectl events -n <namespace>
Мы можем ограничить вывод определенными типами событий с помощью параметра -type:
$ kubectl events -n <namespace> --type=Warning
Проверка событий в пространстве имен может дать нам представление о причине, по которой мы не можем завершить удаление.
Но если и это не поможет, можно проверить журналы контроллера-менеджера, чтобы убедиться, что мы не пропустили никакой информации:
$ kubectl get pods -o name -n kube-system | grep controller-manager | xargs -n 1 kubectl logs -n kube-system
В приведенной выше команде мы получили список подов пространстве имен kube-system.
Затем, используя grep, мы ограничили вывод, чтобы вернуть только имя стручка менеджера контроллера.
После этого мы передали имя подов менеджера контроллера в качестве аргумента в журналы kubectl с помощью xargs.
Если журналы менеджера контроллеров не дают нам никаких указаний на то, в чем может быть проблема, мы можем приступить к принудительному удалению.
Но перед этим мы можем проверить наличие внешних зависимостей.
3. Принудительное удаление пространства имен Kubernetes, застрявшего в состоянии завершения
Чтобы принудительно удалить зависшее пространство имен, мы можем отредактировать ресурс этого пространства имен с помощью kubectl edit:
$ kubectl edit ns <namespace>
В последующем редакторе мы очистим массив finalizers.
Для этого мы можем удалить все элементы массива.
В качестве альтернативы мы можем просто присвоить финализаторам значение null.
После этого мы запишем изменения и закроем файл.
При удалении финализаторов из ресурса пространства имен удаление пространства имен будет успешно продолжено.
Затем мы можем попробовать подтвердить удаление, получив пространство имен:
$ kubectl get ns <namespace>
Мы должны получить сообщение об ошибке “namespaces <namespace> not found”, подтверждающее, что мы успешно удалили пространство имен.
$ kubectl patch ns <namespace> -p '{"metadata":{"finalizers": null }}'
4. Заключение
В этой статье мы рассмотрели несколько шагов, чтобы проверить, почему пространство имен Kubernetes застревает при завершении работы.
Затем мы обсудили, как принудительно удалять такие пространства имен.\
см. также:
- ☸️ Получение событий Kubernetes по дате с помощью kubectl
- ☸️ Kubernetes metrics | Error from server (ServiceUnavailable)
- ☸️ Как проверить метрики пода / контейнера в OpenShift & Kubernetes
- ☸️ Helm установил Pod в режиме pending
- ☸️ Как создать в Kubernetes службу / аккаунт пользователя и ограничить его одним пространством имен с помощью RBAC