Что такое Blue-Green Deployment?

«Что такое Blue-Green Deployment?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Blue-Green Deployment (сине-зеленое развертывание) — это стратегия выпуска приложений, направленная на минимизацию простоя и риска отката. Она предполагает наличие двух идентичных производственных сред: Blue (активная) и Green (неактивная).

Типичный процесс развертывания:

  1. Blue — обслуживает весь текущий пользовательский трафик.
  2. Green — развертывается новая версия приложения и проходит все тесты (интеграционные, нагрузочные).
  3. После успешного тестирования трафик переключается с Blue на Green (например, путем изменения записи DNS, правил балансировщика нагрузки или переменной окружения в ingress-контроллере).
  4. Blue остается наготове для мгновенного отката, если в Green обнаружатся критические проблемы.

Пример реализации с Kubernetes (используя Service и два Deployment):

# deployment-blue.yaml (активная версия 1.0)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-blue
spec:
  selector:
    matchLabels:
      app: myapp
      version: "1.0"
  template:
    metadata:
      labels:
        app: myapp
        version: "1.0"
    spec:
      containers:
      - name: app
        image: myapp:1.0
---
# deployment-green.yaml (новая версия 2.0)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-green
spec:
  selector:
    matchLabels:
      app: myapp
      version: "2.0"
  template:
    metadata:
      labels:
        app: myapp
        version: "2.0"
    spec:
      containers:
      - name: app
        image: myapp:2.0
---
# service.yaml (изначально указывает на blue)
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    version: "1.0" # Переключение на green: меняем на "2.0"
  ports:
    - port: 80

Преимущества:

  • Нулевой downtime для пользователей.
  • Мгновенный откат (переключение обратно на Blue).
  • Упрощенное тестирование новой версии в продакшн-подобной среде.

Недостатки:

  • Удвоение ресурсов (стоимость инфраструктуры).
  • Сложность с состоянием (stateful) — необходимо синхронизировать базы данных или использовать общее хранилище для обеих сред.