Проверка деплоя из Jenkins в Kubernetes

В пайплайнах Jenkins мы используем Ansible чтобы деплоить в Kubernetes. У этого способа, в отличии от helm, есть и свои преимущества: простота и лёгкий порог вхождения, а так же не нужно держать на сборщиках ещё и сам helm. Но после деплоя нужно добавить проверки, корректно ли развернулось.

Ситуация, если у нас новый сервис.

Нужно то всего лишь продолжить конвейер (Jenkins), когда определённый сервис поднимется и станет принимать запросы. Например, мы таким образом поднимаем бэкапы БД для их проверки. До раскатки и после они не нужны, поэтому каждый раз “с нуля”. Команда kubectl wait без проблем решает это. Например, добавляем в конвейер строчку

kubectl wait -n service-stage --for=condition=Available=True --timeout=30s deploy/service

Разумеется, namespace и имя deployment задаём переменными из конвейера.

И теперь только когда сервис поднялся и все проверки прошли, конвейер продолжит свой путь. Или умрёт по таймауту и мы получим ошибку.

Ситуация, если это обновление сервиса.

Если же это обновление сервиса, тут wait не поможет, так как старый деплоймент уже имеет нужный статус и проверка просто пройдёт по старым параметрам. А запустился ли новый конвейер или нет – уже неизвестно. Тут лучше использовать rollout status. Например:

kubectl rollout status --namespace service-stage deploy/service --timeout=600s

Так как команда ранее начнёт поднимать новую версию сервиса, ответ будет таким:

Waiting for deployment "service" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "service" rollout to finish: 1 old replicas are pending termination...
deployment "service" successfully rolled out

И снова мы точно будем уверены, что readiness probes прошли и новая версия сервиса готова принимать трафик.

#kubernetes #jenkins


Статьи дополняются по мере получения новой информации. Если есть уточнение – напишите в комментариях в Mastodon.

Алексей Убоженко DevOps Linux Engineer Mastodon Contacts