Стратегии релиза: blue/green, canary, rollback

О лекции

Blue/green держит два контура и переключает трафик после прогрева. Canary отдаёт долю запросов новой версии и смотрит метрики. Rollback возвращает прежний digest. После несовместимой миграции БД откат кода может быть невозможен.

CI/CD cicd собеседование

Выкат — управляемый риск. Не docker compose up на прод. Стратегия отвечает на два вопроса: как уменьшить радиус поражения и как отменить.

Без плана отката вы умеете только ехать вперёд. Без метрик canary — «почувствовали руками».

Rolling update в Kubernetes постепенно меняет поды. Это не canary по трафику. Пока нет mesh или split на ingress, доли 1% вы не контролируете. Только число готовых подов новой ревизии.

Пример. Три пода из пяти уже новые — это rolling. Canary — «5% запросов на новый digest, 95% на старый». Без отдельного веса на балансировщике это разные вещи.

Blue/green

Два стека. Green греется, проходит smoke. Потом балансировщик переключает стрелку: DNS, ingress или вес.

Откат — стрелка назад. Работает, если старый код ещё читает схему БД. Цена: почти двойные ресурсы на время выката.

Canary

Сначала 1% трафика, потом 10%, потом 100%. Смотрят ошибки, P99, насыщение. Нужна метка ревизии в метриках. Иначе вы видите общий график и не замечаете, что горят только новые поды.

Стоп — автоматический откат или заморозка, не «подождём до понедельника». Без SLO canary — ритуал.

# 100% трафика → api-stable  (digest sha256:old)
#   5% трафика → api-canary  (digest sha256:new)
#
# Стоп, если ошибки canary заметно выше stable
# или P99 canary вышел за бюджет
#
# Откат: вес canary → 0, образ = sha256:old
# (только если схема БД ещё совместима со старым кодом)

Малая доля на новую ревизию. Стоп по метрикам, не на глаз.

Rollback и миграции

Откат — вернуть предыдущий digest. Не hotfix руками в контейнере.

Миграция схемы связывает руки сильнее оркестратора. Добавили колонку NOT NULL — старый код не стартует. Откатить образ нельзя. Нужен expand/contract: сначала совместимая схема, потом код, потом убрать старое.

Пример. Сначала колонка nullable. Выкатили код, который пишет в старое и новое поле. Заполнили данные. Потом NOT NULL. Потом удалили старое поле следующим релизом. На каждом шаге откат образа ещё возможен.

Feature flag дополняет стратегию, не заменяет. Код уже в проде, поведение выключают без отката образа. Флаг, который живёт год, — второй источник правды.

Типичная ошибка

Canary без метки ревизии: смотрите общий P99 и не видите, что 5% новой версии горят. Откатить код после несовместимой миграции — старый бинарь не стартует. Rolling update назвать canary, хотя трафик не режется по доле.

На собеседовании

Blue/green — два контура и стрелка. Canary — доля плюс SLO. Rollback — прежний digest, если схема ещё совместима. Rolling в Kubernetes сам по себе не split трафика.