Что такое финализаторы в Kubernetes
Финализаторы в Kubernetes — это механизм, который гарантирует выполнение операций очистки перед полным удалением объекта из кластера. Когда вы удаляете ресурс, например PVC, Kubernetes не стирает его сразу из etcd. Вместо этого он устанавливает временную метку deletionTimestamp и приостанавливает удаление. Ресурс останется в состоянии Terminating, пока все контроллеры не удалят свои записи из списка metadata.finalizers.
Это критически важно для согласованности данных, особенно при работе с внешними системами, такими как облачные хранилища. Если финализатор не сработает, внешний ресурс может остаться нетронутым, что приведет к «мусору» или потере данных.
Как Kubernetes обрабатывает удаление ресурсов
Процесс удаления ресурса в Kubernetes состоит из нескольких этапов. Понимание этой логики помогает диагностировать зависания.
Шаг 1: Запрос на удаление
Пользователь отправляет команду, например, kubectl delete pvc my-claim.
Шаг 2: Установка deletionTimestamp
Kubernetes API-сервер устанавливает метку metadata.deletionTimestamp для объекта. Сам объект остается в базе данных etcd.
Шаг 3: Пауза из-за финализаторов
Если у объекта есть поле metadata.finalizers, удаление приостанавливается. Контроллеры начинают работать над очисткой.
Шаг 4: Выполнение логики очистки
Каждый контроллер, владеющий финализатором, должен выполнить свою задачу (например, отключить диск). После успешного завершения контроллер удаляет свою запись из списка finalizers.
Шаг 5: Финальное удаление
Как только список финализаторов становится пустым, сборщик мусора Kubelet окончательно удаляет объект из etcd.
Почему PVC зависает в состоянии Terminating
Если PVC не удаляется, скорее всего, один из контроллеров не может выполнить очистку и убрать свою запись из финализаторов. В случае с PVC главная причина — это финализатор kubernetes.io/pvc-protection.
Этот системный финализатор предотвращает удаление PVC, пока на него ссылаются активные поды. Если под, использующий PVC, завис в состоянии Terminating сам, то и PVC не удалится.
Основные виновники зависания PVC:
- Поды, которые всё ещё ссылаются на PVC, даже если они находятся в процессе удаления.
- Недоступность узла (Node), на котором запущен под, что мешает завершить процесс.
- Проблемы с драйвером CSI (например, vSphere CSI), который не может отмонтировать или отключить том.
- Устаревшие объекты
VolumeAttachment, которые не были очищены.
Для диагностики используйте команду:
kubectl get pvc my-claim -o yaml
Проверьте, что поле metadata.finalizers не пустое.
{{IMAGE_2}}
Отладка зависших финализаторов с CSI (на примере vSphere)
Рассмотрим пример с драйвером vSphere CSI. Драйвер использует финализатор external-attacher/csi-vsphere-vmware-com на объектах PersistentVolume (PV). Этот финализатор гарантирует, что драйвер выполнит очистку тома.
Если PV не удаляется, это часто связано с зависшим объектом VolumeAttachment. В таких случаях может потребоваться ручное вмешательство.
Например, если лог CSI показывает ошибку Unmap Volume, это значит, что драйвер не смог отключить том.
Error: UnmapVolume failed for volume vol-xyz on node node-123: rpc error: code = Internal desc = operation timed out
В этом сценарии очистка диска не произошла. Решение часто включает:
1. Найти и вручную удалить зависший VolumeAttachment.
2. Удалить финализатор с PV (если это безопасно).
3. Удалить сам PV.
Советы по предотвращению зависаний
- *Никогда не удаляйте финализаторы бездумно.** Они служат для защиты данных.
1. Контролируйте поды: Используйте readiness и liveness пробы, чтобы поды корректно завершали работу и отключали PVC.
2. Мониторинг VolumeAttachment: Настройте алерты для отслеживания объектов VolumeAttachment, которые долго не удаляются.
3. Автоматизация поиска: Создайте скрипты для регулярного сканирования кластера на предмет ресурсов в состоянии Terminating дольше лимита (например, 15 минут).
Заключение
Финализаторы — это фундамент надежности Kubernetes. Они обеспечивают безопасное удаление ресурсов, но при сбое контроллера могут привести к зависанию PVC в состоянии Terminating. Глубокое понимание работы с финализаторами и CSI-драйверами критически важно для поддержания стабильности платформы.
Если вы столкнулись с заблокированными ресурсами или хотите выстроить надёжную систему управления томами, обратитесь к нашим экспертам для аудита и настройки.