Finalizers - это механизм, который позволяет контролировать процесс удаления объектов в кластере. Он гарантирует, что перед удалением объекта будут также выполнены необходимые действия по очистке или завершению связанных ресурсов.
Как это работает?
Когда мы инициализируем удаление объекта kubernetes, он (kubernetes) устанавливает в metadata поле deletionTimestamp, но не удаляет объект до выполнения финализаторов. Затем контроллеры, связанные с объектом, обнаруживают, что объект помечен на удаление и имеет финализаторы. Контроллеры выполняют нужные действия, например удаляют связанные ресурсы. После успешного выполнения всех действий, контроллеры удаляют свои финализаторы из списка и когда данный список пуст, kubernetes окончательно удаляет ресурс из кластера.
Что делать если связанных ресурсов уже нет, но процесс удаления "завис"?
Такое не редко можно встретить, если удаляем например целиком namespace через:
kubectl delete ns <ns_name>
Коретка не возвращается, сам namespace висит в статусе terminating, хотя ресурсов внутри уже нет. В таком случае нужно провести ряд ручных действий по удалению NS. Как правило это нужно только для него, другие объекты, например PVC могут быть удалены просто с ручным удалением finalizers из манифеста. Например через kubectl edit pvc <name>.
Сначала сохраним спецификацию ns в виде json файла.
kubectl get ns <ns_name> -o json > namespace.json
Открываем созданный файл на редактирование, у нас должна быть строка:
"spec": {
"finalizers": [
"kubernetes"
]
}Нам нужно удалить kubernetes finalizers, оставив пустой массив. То есть приводим к виду:
"spec": {
"finalizers": []
}Затем применяем изменения назад в кластер командой:
kubectl replace --raw "/api/v1/namespaces/<имя-namespace>/finalize" -f namespace.json
После этого повисший ns в состоянии terminating будет удален.
#kubernetes