Стратегии деплоя: rolling, blue-green, canary, feature flags, откат

↑ Этап 3 · CI-CD

Обязательно~5 мин чтенияУровень: middle

Зачем это на собесе

Ключевой вопрос про релизы без простоя и откат: нужно сравнить стратегии и назвать компромиссы.

Сравнение

СтратегияСутьПростойОткатРесурсыРиск
Recreateостановить старую → запустить новуюестьпередеплой1×высокий
Rolling updateпостепенная замена экземпляровнетоткат rolling (минуты)~1× + surgeсредний (две версии одновременно)
Blue-Greenдве полные среды; переключение трафиканетмгновенный (переключить обратно)2×низкий
Canaryнебольшая доля трафика на новую версию, затем расширениенетбыстрый (убрать canary)1× + canaryочень низкий (ограниченный охват)
A/B testingразные версии для сегментов пользователей ради метрикнетбизнес-эксперимент
Shadow (mirroring)копия трафика на новую версию без влияния на ответынет2×проверка без риска
Feature flagsкод выкачен, фича выключена; включение отдельнонетвыключить флаг1×минимальный

Rolling update (Kubernetes)

strategy:
  type: RollingUpdate
  rollingUpdate: { maxSurge: 25%, maxUnavailable: 0 }       # не терять ёмкость

Поды заменяются порциями; трафик идёт только на Ready поды (readiness probe). Требования: обратная совместимость версий (две версии работают вместе), корректный graceful shutdown, minReadySeconds, PodDisruptionBudget. Откат: kubectl rollout undo deployment/api, helm rollback.

Blue-Green

Blue (v1, активна)  ◀── трафик ── LB/Ingress/Service
Green (v2, новая)       проверяем smoke-тестами, прогреваем
        → переключение селектора Service / weight в Ingress / DNS
Откат: переключить обратно на Blue (пока не удалена)

Плюсы: мгновенное переключение и откат, тестирование на полноценной копии. Минусы: двойная инфраструктура; БД общая — схема должна быть совместима с обеими версиями (expand/contract); долгие сессии/состояние; очередь/кэш.

Canary

Постепенно: 1% → 5% → 25% → 50% → 100% с анализом метрик на каждом шаге (ошибки, латентность, бизнес-метрики). Автоматизация: Argo Rollouts, Flagger (Istio/Linkerd/NGINX/Traefik), метрики из Prometheus; автооткат при нарушении SLO.

# Argo Rollouts
strategy:
  canary:
    steps:
      - setWeight: 10
      - pause: { duration: 5m }
      - analysis: { templates: [{ templateName: success-rate }] }
      - setWeight: 50
      - pause: { duration: 10m }

Маршрутизация по весу, заголовку (X-Canary: true), cookie, пользователям (внутренние сначала). Nginx Ingress: nginx.ingress.kubernetes.io/canary: "true", canary-weight.

Feature flags

Разделение деплоя (код в проде) и релиза (включение функциональности):

  • включение по пользователям, процентам, окружениям, регионам; kill switch (мгновенное отключение);
  • инструменты: LaunchDarkly, Unleash, Flagsmith, GrowthBook, OpenFeature (стандарт SDK), собственные;
  • trunk-based development с незавершённым кодом за флагом;
  • риски: «мёртвые флаги» (чистить), комбинаторика состояний, тестирование обеих веток, безопасность (флаги на клиенте публичны), производительность вычисления.

Откат

Должен быть быстрым, автоматическим, проверенным.

  • откат артефакта: предыдущий неизменяемый тег образа/версия чарта (helm rollback api 12);
  • откат конфигурации/флага: мгновенно;
  • БД: совместимые миграции позволяют откатить только код; деструктивные изменения откладываются (contract позже);
  • критерии автоотката: рост 5xx, латентность, провал readiness/smoke, падение бизнес-метрик; helm upgrade --atomic --timeout 5m;
  • tag/версия предыдущего релиза известны и доступны (реестр не очищен);
  • учения по откату, runbook.

Проверки после деплоя

  • readiness/liveness и smoke-тесты (ключевые эндпоинты, логин, критичный сценарий);
  • мониторинг золотых сигналов: ошибки, задержки, трафик, насыщение; сравнение с базовой линией;
  • аннотации релиза на дашбордах Grafana, трассы по версии (service.version OTel);
  • синтетический мониторинг; алерты на всплески после релиза.

Особые случаи

  • stateful-сервисы и миграции схем: expand/contract, dual-write, бэкфилл;
  • фронтенд SPA: хэшированные файлы, index.html без кэша, хранить предыдущие ассеты (старые вкладки), CDN invalidation;
  • API-контракты: версионирование, обратная совместимость, депрекейшн;
  • очереди/воркеры: совместимость форматов сообщений, постепенный вывод старых консьюмеров;
  • долгоживущие соединения (WebSocket, gRPC streaming): плавный drain.

Выбор стратегии

СитуацияВыбор
простой сервис, допустим простойrecreate
stateless API, Kubernetesrolling update + readiness + PDB
критичные релизы, быстрый откатblue-green
риск высок, большой трафикcanary + автоанализ
эксперименты и постепенное включениеfeature flags
нельзя тестировать на продеshadow-трафик + staging

Вопросы с ответами