Modern QA2026Канареечные деплои
Join

Course06 Observability-Driven Testing

Cutting-edge · Chapter 06

Канареечные деплои

Updated Jul 2026

Что такое канареечный деплой?

Канареечный деплой направляет небольшой процент продакшен-трафика на новую версию, в то время как старая версия обслуживает остальной трафик. В отличие от feature-флагов (которые управляют функциями на уровне приложения), канареечные деплои управляют на уровне инфраструктуры — пользователь не знает, что обращается к другой версии.

Название происходит от «канарейки в угольной шахте» — небольшая группа пользователей выступает в роли системы раннего предупреждения. Если канареечная версия показывает деградацию метрик, трафик переключается обратно на стабильную версию до того, как пострадает большинство пользователей.

Сравнение стратегий деплоя

Стратегия Разделение трафика Скорость отката Стоимость инфраструктуры Потребность в наблюдаемости
Канареечный 1-10% новая, остальное старая Секунды (переключение трафика) Низкая (несколько новых подов) Высокая (сравнение метрик)
Blue-Green 100% переключение Секунды (переключение DNS/LB) Высокая (2x инфраструктура) Средняя
Rolling Постепенная замена подов Минуты (масштабирование новых вниз) Низкая Средняя
Shadow/Dark 0% пользовательского трафика (зеркалирование) Н/Д (нет воздействия на пользователей) Средняя (дублирование обработки) Высокая

Когда использовать каждую

  • Канареечный: Выбор по умолчанию для критичных сервисов, где вы хотите статистическую валидацию перед полным выпуском
  • Blue-Green: Когда нужна мгновенная возможность полного отката (например, изменения схемы базы данных)
  • Rolling: Для некритичных сервисов, где достаточно постепенной замены
  • Shadow: Для валидации полного переписывания на продакшен-трафике без воздействия на пользователей

Канареечный анализ с Kayenta (Spinnaker)

Kayenta — это инструмент автоматического канареечного анализа от Netflix, интегрированный со Spinnaker. Он сравнивает метрики между канареечной и базовой версиями и выносит статистическое заключение.

{
  "canaryConfig": {
    "name": "checkout-service-canary",
    "judge": {
      "judgeConfigurations": {},
      "name": "NetflixACAJudge-v1.0"
    },
    "metrics": [
      {
        "name": "error_rate",
        "query": {
          "type": "prometheus",
          "customInlineTemplate": "sum(rate(http_requests_total{status=~\"5..\",app=\"checkout\",version=\"${scope}\"}[5m])) / sum(rate(http_requests_total{app=\"checkout\",version=\"${scope}\"}[5m]))"
        },
        "analysisConfigurations": {
          "canary": {
            "direction": "increase",
            "critical": true,
            "mustHaveData": true
          }
        },
        "scopeName": "default"
      },
      {
        "name": "latency_p99",
        "query": {
          "type": "prometheus",
          "customInlineTemplate": "histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{app=\"checkout\",version=\"${scope}\"}[5m])) by (le))"
        },
        "analysisConfigurations": {
          "canary": {
            "direction": "increase",
            "critical": true
          }
        },
        "scopeName": "default"
      },
      {
        "name": "saturation_cpu",
        "query": {
          "type": "prometheus",
          "customInlineTemplate": "avg(rate(container_cpu_usage_seconds_total{app=\"checkout\",version=\"${scope}\"}[5m]))"
        },
        "analysisConfigurations": {
          "canary": {
            "direction": "increase",
            "critical": false
          }
        },
        "scopeName": "default"
      }
    ],
    "classifier": {
      "groupWeights": {
        "Errors": 40,
        "Latency": 35,
        "Saturation": 25
      }
    }
  }
}

Как Kayenta оценивает канарейки

  1. Сбор метрик с канареечной и базовой версий за окно анализа
  2. Сравнение распределений с помощью теста Манна-Уитни (непараметрический)
  3. Оценка каждой метрики как Прошла, Пограничная или Провалена
  4. Применение весов групп (Ошибки 40%, Задержка 35%, Насыщение 25%)
  5. Вычисление финальной оценки (0-100). Обычно >70 = продвижение, <50 = откат, 50-70 = продление наблюдения

Канареечный деплой с Argo Rollouts (Kubernetes-нативный)

Для команд, не использующих Spinnaker, Argo Rollouts предоставляет Kubernetes-нативные канареечные деплои:

# argo-canary-rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: checkout-service
spec:
  replicas: 10
  strategy:
    canary:
      canaryService: checkout-canary
      stableService: checkout-stable
      trafficRouting:
        istio:
          virtualService:
            name: checkout-vsvc
            routes:
              - primary
      steps:
        - setWeight: 5       # 5% to canary
        - pause: { duration: 5m }
        - analysis:
            templates:
              - templateName: canary-analysis
            args:
              - name: service-name
                value: checkout-service
        - setWeight: 25      # 25% to canary
        - pause: { duration: 10m }
        - analysis:
            templates:
              - templateName: canary-analysis
        - setWeight: 50      # 50% to canary
        - pause: { duration: 10m }
        - analysis:
            templates:
              - templateName: canary-analysis
        - setWeight: 100     # promote canary to stable

---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: canary-analysis
spec:
  metrics:
    - name: error-rate
      interval: 1m
      successCondition: result < 0.01
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            sum(rate(http_requests_total{status=~"5..",app="checkout",
              rollouts-pod-template-hash="{{args.canary-hash}}"}[5m]))
            /
            sum(rate(http_requests_total{app="checkout",
              rollouts-pod-template-hash="{{args.canary-hash}}"}[5m]))
    - name: latency-p99
      interval: 1m
      successCondition: result < 0.5
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            histogram_quantile(0.99, sum(rate(
              http_request_duration_seconds_bucket{app="checkout",
                rollouts-pod-template-hash="{{args.canary-hash}}"}[5m])) by (le))

Ключевые решения для канареечных деплоев

Сколько трафика направлять на канарейку?

Процент трафика Сценарий использования Уровень риска
1% Высокорисковые изменения (платежи, аутентификация) Очень низкий
5% Стандартные релизы функций Низкий
10% Низкорисковые изменения с высокой уверенностью Низкий
25% Изменения, требующие большего объёма трафика для статистической значимости Средний

Как долго наблюдать?

Окно наблюдения зависит от объёма трафика и требуемой статистической значимости:

  • Высоконагруженные сервисы (>1000 rps): 10-15 минут обеспечивают достаточно точек данных
  • Средний трафик (100-1000 rps): 30-60 минут
  • Низкий трафик (<100 rps): 2-6 часов (рассмотрите дополнение синтетическим трафиком)

Какие метрики сравнивать?

Как минимум, сравнивайте между канарейкой и базовой версией:

  1. Доля ошибок (критично — всегда включайте)
  2. Перцентили задержки (p50, p95, p99)
  3. Метрики насыщения (CPU, память на под)
  4. Бизнес-метрики (конверсия, доход на запрос — если доступны в реальном времени)

Распространённые ошибки канареечных деплоев

Ошибка Проблема Решение
Недостаточный трафик Невозможно достичь статистической значимости Увеличьте процент канарейки или окно наблюдения
Проверка только средних Маскирует регрессии хвостовой задержки Сравнивайте p95 и p99, а не только среднее
Нет автоматического отката Задержка человека позволяет затронуть больше пользователей Настройте автоматический откат по порогу метрик
Игнорирование бизнес-метрик Технически быстро, но функционально сломано Включите конверсию и число ошибок в канареечный анализ
Канарейка той же версии Канарейка всегда проходит, потому что идентична базовой Убедитесь, что канарейка действительно запускает новую версию
Эффекты прогрева кеша Канарейка начинает медленно из-за холодных кешей Предоставьте период прогрева перед началом сравнения метрик

Чек-лист канареечного деплоя

Перед включением канареечных деплоев:

  • Пайплайн метрик может дифференцировать трафик по версиям (метки, заголовки или идентификатор пода)
  • Автоматический откат настроен (не только ручное вмешательство)
  • Окно анализа достаточно длинное для вашего объёма трафика
  • И канарейка, и базовая версия мониторятся одними и теми же дашбордами
  • Маршрутизация алертов учитывает канареечные сбои (не вызывайте дежурного для ожидаемых экспериментов)
  • Команда понимает, что откат — это успех, а не провал: вы обнаружили проблему до того, как она достигла всех пользователей