- PVSM.RU - https://www.pvsm.ru -

Рады представить свой новый Open Source-проект. На этот раз мы сделали совсем небольшую, казалось бы, утилиту, но столь полезную буквально для любой инсталляции Kubernetes. В чем же её суть? K8s-image-availability-exporter [1] — это Prometheus exporter, позволяющий проактивно предупредить пользователя об образах, которые прописаны в объектах Kubernetes (например, поле image в Deployment), но отсутствуют в реестре контейнеров (Docker Registry и т.п.).
Kubernetes — крайне динамическая система. Оперируя инфраструктурой в K8s-кластере, мы предполагаем, что в любой момент времени pod’ы — да что там pod'ы: целые узлы! — могут быть удалены. Чтобы убедиться в этом, мы применяем различные подходы chaos engineering [2], в основном убивая случайные узлы Kubernetes с тем, чтобы увидеть, готовы ли клиентские приложения к пересозданию pod’ов.
Для корректной работы приложения в таких динамических условиях Kubernetes надо соблюдать минимальные правила: создание PodDisruptionBudgets [3], деплой сразу нескольких реплик приложения, корректная конфигурация podAffinity, nodeAffinity и т.д.
Однако, несмотря на такие очевидные политики, мы не всегда можем повлиять на их применение. Реальность же такова, что нам пришлось (и не один раз!) встретиться с проблемами, когда у клиента по какой-то причине приложение запущено в единственной реплике. Оно работает так месяцами и почти не деплоится. Его редкие выкаты проводятся без нашего участия и, конечно, без werf [4] (эта утилита смогла бы [5] сделать всё сама). В то же время реестр настроен на автоматическое удаление всех старых образов.И вот однажды, когда по какой-то причине потребуется пересоздать pod, случится непоправимое.
Недавно — после того, как типовая операция перезаказа узла K8s привела к часовому простою, поскольку искали человека, который вообще сможет собрать приложение, — мы и решили написать k8s-image-availability-exporter. Идея утилиты — в автоматизации, позволяющей предотвратить последствия подобных ситуаций вне зависимости от соблюдения организационных политик и других «случайных» факторов.
Общий алгоритм реализации сводится к следующему:
--check-period) достаём из очереди порцию наиболее долго не проверявшихся образов и смотрим их наличие в registry. Количество образов динамически варьируется так, чтобы за 10 минут проверить все возможные образы кластера.
PodSpec присутствует imagePullSecrets, достаём нужные нам Secrets.imagePullSecrets) или без них заходим в реестр образов (container registry) и проверяем, есть ли там нужный образ.
В результате проделанной работы экспортируются следующие виды метрик (под ТИП подразумевается deployment, statefulset, daemonset и cronjob):
k8s_image_availability_exporter_ТИП_available — ненулевое значение говорит об успешной проверке образа;k8s_image_availability_exporter_ТИП_bad_image_format — ненулевое значение указывает на некорректный формат поля image;k8s_image_availability_exporter_ТИП_absent — ненулевое значение говорит об отсутствии манифеста образа в реестре контейнеров;k8s_image_availability_exporter_ТИП_registry_unavailable — ненулевое значение показывает на общую недоступность реестра (возможно, из-за сетевых проблем);k8s_image_availability_exporter_deployment_registry_v1_api_not_supported — ненулевое значение указывает на первую версию Docker Registry API (такие образы лучше игнорировать с помощью аргумента --ignored-images);k8s_image_availability_exporter_ТИП_authentication_failure — ненулевое значение свидетельствует об ошибке аутентификации в реестре контейнеров (проверьте imagePullSecrets);k8s_image_availability_exporter_ТИП_authentication_failure — ненулевое значение свидетельствует об ошибке авторизации в реестре контейнеров (проверьте imagePullSecrets);k8s_image_availability_exporter_ТИП_unknown_error — ненулевое значение говорит об ошибке, не поддающейся встроенной классификации (получите дополнительную информацию в логах экспортера);k8s_image_availability_exporter_completed_rechecks_total — инкрементируется в каждом цикле проверки наличия образов в реестре.
Последний штрих — предусмотрен настраиваемый список образов, которые нужно игнорировать при этом мониторинге (--ignored-images).
Код написан на Go, распространяется на условиях свободной лицензии Apache 2.0 и доступен на GitHub [1]. Если есть предложения по его улучшению или замечания по использованию утилиты — будем рады!
Мы уже внедрили утилиту на десятках Kubernetes-кластеров и результатами её использования очень довольны. Однако формально текущий статус разработки — альфа-версия, поэтому применяйте её на свой страх и риск.
Достаточно трёх шагов:
git pull https://github.com/flant/k8s-image-availability-exporter.gitkubectl apply -f deploy/Подробнее (включая примеры готовых конфигураций для Prometheus) — см. в README [6].
Теперь — с k8s-image-availability-exporter — мы получаем алерты о том, что у каких-либо из запущенных Kubernetes-контроллеров пропал(и) образ(ы) контейнеров в registry. Это позволяет решить проблему до того, как она себя проявит.
Альтернативный путь решения — не чистить registry вообще или же повсеместно использовать утилиты, в которых эта проблема уже решена системно (как это сделано в werf).
Читайте также в нашем блоге:
Автор: Андрей Климентьев
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/353441
Ссылки в тексте:
[1] K8s-image-availability-exporter: https://github.com/flant/k8s-image-availability-exporter
[2] chaos engineering: https://habr.com/ru/company/flant/blog/460367/
[3] PodDisruptionBudgets: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
[4] werf: https://werf.io/
[5] смогла бы: https://ru.werf.io/documentation/reference/cleaning_process.html#%D0%BE%D1%87%D0%B8%D1%81%D1%82%D0%BA%D0%B0-docker-registry
[6] README: https://github.com/flant/k8s-image-availability-exporter/blob/master/README.md
[7] Представляем shell-operator: создавать операторы для Kubernetes стало ещё проще: https://habr.com/ru/company/flant/blog/447442/
[8] Расширяем и дополняем Kubernetes (обзор и видео доклада): https://habr.com/ru/company/flant/blog/455543/
[9] Мониторинг и Kubernetes (обзор и видео доклада): https://habr.com/ru/company/flant/blog/412901/
[10] werf — наш инструмент для CI/CD в Kubernetes (обзор и видео доклада): https://habr.com/ru/company/flant/blog/460351/
[11] Источник: https://habr.com/ru/post/495358/?utm_source=habrahabr&utm_medium=rss&utm_campaign=495358
Нажмите здесь для печати.