Прямой ответ
Blue-green deployment — стратегия развертывания с двумя идентичными окружениями (blue-green — «синее и зелёное окружения» — blue-green — incident — «одно работает, другое обновляется» — blue-green), зачем: развертывание без простоя (blue-green — «ноль даунтайма» — blue-green — incident — «трафик переключается мгновенно» — blue-green — k8s — «мгновенный откат» — blue-green); как работает (blue-green — «два окружения» — blue-green): (1) Синее окружение (blue-green — «текущая продакшн-версия» — blue-green — incident — «обслуживает трафик» — blue-green — k8s — «активное окружение» — blue-green); (2) Зелёное окружение (blue-green — «новая версия» — blue-green — incident — «обновляется» — blue-green — k8s — «неактивное окружение» — blue-green); (3) Переключение (blue-green — «трафик перенаправляется» — blue-green — incident — «с синего на зелёное» — blue-green — k8s — «мгновенно» — blue-green — «service selector меняется» — blue-green); (4) Откат (blue-green — «если проблемы» — blue-green — incident — «трафик возвращается на синее» — blue-green — k8s — «мгновенный откат» — blue-green — «переключение обратно» — blue-green); преимущества (blue-green): (1) Ноль даунтайма (blue-green — «без остановки сервиса» — blue-green — incident — «трафик не прерывается» — blue-green — k8s — «мгновенное переключение» — blue-green); (2) Мгновенный откат (blue-green — «откат за секунды» — blue-green — incident — «переключение обратно» — blue-green — k8s — «без ожидания» — blue-green); (3) Тестирование в проде (blue-green — «зелёное можно тестировать» — blue-green — incident — «до переключения» — blue-green — k8s — «проверка перед запуском» — blue-green); (4) Изоляция (blue-green — «окружения изолированы» — blue-green — incident — «проблемы в зелёном не влияют на синее» — blue-green — k8s — «безопасное обновление» — blue-green); недостатки (blue-green): (1) Двойные ресурсы (blue-green — «нужно 2× ресурсов» — blue-green — incident — «два окружения работают» — blue-green — k8s — «дороже» — blue-green); (2) Сложность БД (blue-green — «миграции БД сложно» — blue-green — incident — «обе версии должны работать с одной БД» — blue-green — k8s — «обратная совместимость» — blue-green); (3) Состояние (blue-green — «stateful приложения сложно» — blue-green — incident — «переключение состояния» — blue-green — k8s — «сложнее» — blue-green); когда использовать (blue-green): критичные сервисы (blue-green — «даунтайм неприемлем» — blue-green — incident — «24/7» — blue-green), рискованные изменения (blue-green — «нужен быстрый откат» — blue-green — incident — «мгновенный откат» — blue-green), тестирование в проде (blue-green — «проверить перед запуском» — blue-green — incident — «зелёное можно тестировать» — blue-green); антипаттерны: использовать для stateful (blue-green — «stateful приложения» — blue-green — incident — «сложно переключать состояние» — blue-green — «лучше canary» — blue-green), игнорировать БД (blue-green — «миграции без обратной совместимости» — blue-green — incident — «откат невозможен» — blue-green — «обратная совместимость обязательна» — blue-green).
Практика: blue-green deployment в Kubernetes
Два окружения (blue-green — Deployment blue (blue-green — apiVersion: apps/v1 kind: Deployment metadata: name: myapp-blue spec: replicas: 3 selector: matchLabels: app: myapp version: blue template: metadata: labels: app: myapp version: blue (blue-green — «синее окружение» — blue-green — k8s — Deployment green (blue-green — metadata: name: myapp-green ... version: green (blue-green — «зелёное окружение» — blue-green — k8s); Service (blue-green — apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp version: blue ports: - port: 80 (blue-green — «service указывает на синее» — blue-green — k8s — «selector version: blue» — blue-green); Переключение (blue-green — kubectl patch service myapp -p '{"spec":{"selector":{"version":"green"}}}' (blue-green — «service переключается на зелёное» — blue-green — k8s — «мгновенно» — blue-green — incident); Откат (blue-green — kubectl patch service myapp -p '{"spec":{"selector":{"version":"blue"}}}' (blue-green — «service возвращается на синее» — blue-green — k8s — «мгновенный откат» — blue-green — incident); Мониторинг (метрики — метрики обоих окружений (метрики — «blue и green» — метрики — incident — «сравнение» — метрики — k8s).
Практический сценарий: развертывание новой версии API
Контекст: API сервис (k8s — критичный (incident — «24/7» — incident — blue-green), боль: даунтайм неприемлем (blue-green — «даунтайм = потеря денег» — blue-green — incident — «нужен ноль даунтайма» — blue-green — k8s); решение — blue-green: (1) синее окружение (blue-green — текущая версия (blue-green — myapp-blue (blue-green — k8s — «обслуживает трафик» — blue-green — incident); (2) зелёное окружение (blue-green — новая версия (blue-green — myapp-green (blue-green — k8s — «обновляется» — blue-green — incident); (3) тестирование (blue-green — зелёное тестируется (blue-green — «внутренние тесты» — blue-green — incident — «до переключения» — blue-green — k8s); (4) переключение (blue-green — kubectl patch service myapp -p '{"spec":{"selector":{"version":"green"}}}' (blue-green — «трафик на зелёное» — blue-green — k8s — «мгновенно» — blue-green — incident); (5) мониторинг (метрики — метрики зелёного (метрики — «ошибки/латентность» — метрики — incident — «сравнение с синим» — метрики — k8s); (6) откат (blue-green — если проблемы (blue-green — kubectl patch service myapp -p '{"spec":{"selector":{"version":"blue"}}}' (blue-green — «трафик на синее» — blue-green — k8s — «мгновенный откат» — blue-green — incident); результат: развертывание без даунтайма (blue-green — «ноль даунтайма» — blue-green — incident — «трафик переключён» — blue-green — k8s — «откат доступен» — blue-green — «мгновенно» — blue-green); вывод: blue-green решили задачу (развертывание без простоя — blue-green — ADR — «использовать для stateful» — антипаттерн — blue-green — лучше canary — blue-green — техдолг).
FAQ
Что такое blue-green deployment и как он работает? Blue-green (blue-green — стратегия с двумя окружениями (blue-green — «синее и зелёное» — blue-green — incident — «одно работает, другое обновляется» — blue-green — k8s); работает: синее (blue-green — «текущая версия» — blue-green — incident — «обслуживает трафик» — blue-green), зелёное (blue-green — «новая версия» — blue-green — incident — «обновляется» — blue-green), переключение (blue-green — «трафик перенаправляется» — blue-green — k8s — «мгновенно» — blue-green), откат (blue-green — «если проблемы» — blue-green — incident — «переключение обратно» — blue-green); «только одно окружение» — антипаттерн (нет отката — incident — два окружения обязательны — blue-green — ADR — техдолг).
Какие преимущества и недостатки blue-green deployment? Преимущества (blue-green: ноль даунтайма (blue-green — «без остановки» — blue-green — incident — «трафик не прерывается» — blue-green), мгновенный откат (blue-green — «откат за секунды» — blue-green — incident — «переключение» — blue-green), тестирование в проде (blue-green — «зелёное можно тестировать» — blue-green — incident — «до переключения» — blue-green), изоляция (blue-green — «проблемы не влияют» — blue-green — incident — «безопасно» — blue-green); Недостатки (blue-green: двойные ресурсы (blue-green — «2× ресурсов» — blue-green — incident — «дороже» — blue-green), сложность БД (blue-green — «миграции сложно» — blue-green — incident — «обратная совместимость» — blue-green), stateful (blue-green — «сложно» — blue-green — incident — «переключение состояния» — blue-green); «игнорировать недостатки» — антипаттерн (двойные ресурсы/БД — важны — incident — учитывать — blue-green — ADR — техдолг).
Когда использовать blue-green deployment и когда лучше canary? Blue-green (blue-green — когда: критичные сервисы (blue-green — «даунтайм неприемлем» — blue-green — incident — «24/7» — blue-green), рискованные изменения (blue-green — «нужен быстрый откат» — blue-green — incident — «мгновенный откат» — blue-green), тестирование в проде (blue-green — «проверить перед запуском» — blue-green — incident — «зелёное тестируется» — blue-green); Canary (strategii — когда: постепенное развертывание (strategii — «постепенно» — strategii — incident — «не всё сразу» — strategii), A/B тестирование (strategii — «тестирование на части трафика» — strategii — incident — «10% трафика» — strategii); «blue-green для всего» — антипаттерн (canary лучше для постепенного — strategii — выбор по задаче — incident — ADR — техдолг).
Как обрабатывать миграции БД при blue-green deployment? Миграции (blue-green — сложность (blue-green — «обе версии с одной БД» — blue-green — incident — «обратная совместимость» — blue-green — k8s); как: обратная совместимость (blue-green — «миграции обратимы» — blue-green — incident — «обе версии работают» — blue-green — «новая версия работает со старой схемой» — blue-green), expand-contract (blue-green — «сначала добавить, потом удалить» — blue-green — incident — «постепенно» — blue-green — «без breaking changes» — blue-green), тестирование (blue-green — «обе версии с БД» — blue-green — incident — «до переключения» — blue-green); «миграции без обратной совместимости» — антипаттерн (откат невозможен — incident — обратная совместимость обязательна — blue-green — ADR — техдолг).
Источники: Martin Fowler (BlueGreenDeployment), Kubernetes docs (Deployment, Service) — ссылки в шапке.