Урок по треку DevOps: CI/CD, IaC, облака 7 мин

Стратегии деплоя за 7 минут

Recreate, rolling, blue-green, canary, feature flags, откат и совместимость версий при выкатке.

Деплой это момент, когда новая версия начинает обслуживать пользователей. Стратегия деплоя отвечает на три вопроса: будет ли простой, сколько пользователей увидят ошибку новой версии и как быстро откатиться.

Recreate

Остановили все старые экземпляры, запустили новые. Просто, но есть простой. Годится для внутренних инструментов или когда две версии физически не могут работать одновременно (например, единственный воркер, который держит эксклюзивную блокировку).

Rolling update

Экземпляры заменяются порциями: поднять несколько новых, дождаться готовности, убрать столько же старых. Стратегия по умолчанию в Kubernetes (RollingUpdate).

spec:
  replicas: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%        # сколько подов сверх replicas можно поднять
      maxUnavailable: 25%  # сколько может быть недоступно

При 10 репликах maxSurge: 25% округляется вверх (3 пода сверху, максимум 13), maxUnavailable: 25% вниз (не больше 2 недоступных, минимум 8 готовых). Для сервиса, где важна каждая реплика, ставят maxUnavailable: 0.

Rolling работает только при правильной readiness probe: под получает трафик, когда готов, а не когда процесс стартовал. Плюс graceful shutdown: старый под должен доработать начатые запросы после SIGTERM.

Особенность: во время выкатки одновременно работают старая и новая версии. Значит, API и схема базы должны быть совместимы в обе стороны.

Blue-green

Две полные копии окружения: blue (текущая) и green (новая). Новую версию поднимают в green, проверяют, затем переключают трафик целиком (балансировщик, DNS, Service). Откат это переключение обратно, секунды.

Плюсы: мгновенное переключение и откат, можно проверить green до трафика. Минусы: двойные ресурсы на время выкатки, общая база всё равно одна, и миграции должны подходить обеим версиям.

Canary

Новую версию получает небольшая доля трафика: 1%, 5%, 25%, 100%. На каждом шаге сравнивают метрики канарейки со стабильной версией: доля ошибок, задержка, бизнес-метрики. Если хуже, откат, и пострадала только малая доля пользователей.

Автоматизируют через Argo Rollouts, Flagger, сервис-меш (Istio, Linkerd) или веса в балансировщике (split_clients в nginx, weighted target groups в облаке).

Важно: канарейке нужен достаточный трафик, иначе за 5 минут на 1% просто нечего сравнивать.

Feature flags

Флаг отделяет выкатку кода от включения функции. Код уже в проде, а функцию включают для сотрудников, затем для 5% пользователей, затем всем. Выключить флаг быстрее любого отката. Минус: флаги копятся, их надо удалять после полного включения.

Откат

  • В Kubernetes: kubectl rollout undo deployment/app вернёт предыдущую ревизию, --to-revision=N конкретную. История: kubectl rollout history.
  • В blue-green: переключить трафик обратно.
  • Откат невозможен, если новая версия уже необратимо изменила данные. Поэтому миграции делают отдельно и совместимыми.

Миграции и совместимость: expand / contract

Переименовать колонку name в full_name без простоя:

  1. Expand: добавить full_name, код пишет в обе колонки.
  2. Заполнить full_name для старых строк (бэкфилл пачками).
  3. Код читает из full_name.
  4. Contract: когда старая версия кода нигде не работает, удалить name.

Каждый шаг отдельный деплой, и на любом можно откатиться на шаг назад.

Как выбрать

СтратегияПростойРиск для пользователейРесурсыОткат
Recreateестьвсеx1новый деплой
Rollingнетпостепенно всечуть больше x1новый rolling
Blue-greenнетвсе сразу, но после проверкиx2мгновенный
Canaryнетмалая долячуть больше x1быстрый

Частые ошибки

  • Rolling без readiness probe: трафик идёт в под, который ещё не готов.
  • Удаление колонки в том же релизе, где код перестал её использовать: старые поды ещё работают и падают.
  • Канарейка без автоматического сравнения метрик: «посмотрели глазами, вроде нормально».
  • Считать, что blue-green решает проблему базы данных.

Что спросят на собесе

  • Чем blue-green отличается от canary, плюсы и минусы.
  • Как Kubernetes делает rolling update, что такое maxSurge и maxUnavailable.
  • Как выкатить миграцию, которая удаляет или переименовывает колонку.
  • Как откатиться и когда откат невозможен.
  • Зачем feature flags, если есть canary.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.