Какие инструменты используются для раскатки сервисов?
Что проверяют
Понимаете ли вы, как ваш код попадает к пользователям и как выкатить новую версию без простоя и с быстрым откатом. От Python-разработчика не ждут глубин DevOps, но ждут знания про пробы, миграции и остановку процессов. Следом обычно спрашивают, как изменить схему базы, не уронив старую версию сервиса.
Как отвечать
Идите по цепочке:
- образ: Docker, многоэтапная сборка на
python:3.x-slim, зависимости черезuvилиpipс lock-файлом, внутри gunicorn с uvicorn-воркерами или просто uvicorn; - CI/CD: GitLab CI, GitHub Actions или Jenkins прогоняют тесты и линтеры, собирают образ, пушат его в registry и запускают деплой;
- оркестрация: Kubernetes Deployment, манифесты шаблонизируют Helm или Kustomize, выкатку по GitOps делает Argo CD. На ВМ без Kubernetes раскатывают Ansible и systemd, инфраструктуру описывает Terraform;
- стратегия:
RollingUpdateсmaxSurgeиmaxUnavailable(по умолчанию по 25%), канарейка и blue-green через Argo Rollouts или Flagger, фича-флаги для рискованной логики; - пробы:
readinessProbeрешает, пускать ли трафик на под,livenessProbeрешает, перезапускать ли его. Это разные проверки и разные эндпоинты; - миграции: Alembic или Django migrations отдельным Job до выкатки, по схеме expand и contract: добавить колонку, переключить код, потом удалить старое;
- откат:
kubectl rollout undo,helm rollbackили возврат коммита в GitOps-репозитории.
После выкатки смотрите метрики и ошибки в Prometheus, Grafana и Sentry: по ним принимается решение об откате.
Где спотыкаются
Думают, что Kubernetes откатит сломанную версию сам. Deployment только остановит выкатку, если новые поды не проходят пробы, и через progressDeadlineSeconds (по умолчанию 600 секунд) пометит её как неуспешную. Автоматический откат по метрикам дают Argo Rollouts или Flagger.
Выкатывают миграцию, которая удаляет или переименовывает колонку. Во время rolling update старые поды ещё работают и начинают падать.
Проверяют в livenessProbe базу и внешние сервисы. Когда база подтормаживает, Kubernetes перезапускает все поды разом, и небольшая проблема превращается в полный простой.