Проверка деплоя из 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 прошли и новая версия сервиса готова принимать трафик.
Статьи дополняются по мере получения новой информации. Если есть уточнение – напишите в комментариях в Mastodon.