Что такое Canary (канареечные развертывания)?go-105

Основная концепция

Canary-развертывание — это стратегия постепенного внедрения изменений в production, при которой новая версия приложения сначала развертывается для небольшой части пользователей/трафика, чтобы проверить её стабильность и корректность работы перед полным rollout'ом.

Название происходит из шахтерской практики, где канареек использовали для обнаружения опасных газов в шахтах.

Как работает Canary-деплой

  1. Развертывание новой версии:

    • Новая версия (canary) разворачивается параллельно с текущей стабильной версией
    • Получает небольшой процент трафика (обычно 1-5% на начальном этапе)
  2. Мониторинг и анализ:

    • Сравниваются метрики между canary и стабильной версиями
    • Проверяются ошибки, latency, бизнес-метрики
  3. Принятие решения:

    • Если все OK — постепенно увеличивается процент трафика
    • Если проблемы — автоматический откат

Реализация в Kubernetes

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "5" # 5% трафика на canary
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - backend:
          service:
            name: canary-service
            port:
              number: 80
        path: /
        pathType: Prefix
      - backend:
          service:
            name: main-service
            port:
              number: 80
        path: /
        pathType: Prefix

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

Минимизация риска - проблемы затрагивают только малый % пользователей
Реальное тестирование - проверка в реальной production-среде
Гибкость - можно быстро откатить или увеличить трафик
Data-driven решения - основано на реальных метриках

Недостатки

Сложность реализации - требуется инфраструктура для разделения трафика
Мониторинг - нужны хорошие инструменты для сравнения версий
Stateful сервисы - сложно реализовать для систем с состоянием

Критерии успешного Canary

  1. Автоматизированные проверки:

    • Нет роста 5xx ошибок
    • Latency в пределах допустимого
    • Корректность бизнес-логики
  2. Продолжительность:

    • Обычно 1-2 часа для stateless сервисов
    • До 24 часов для критических систем
  3. Градуальное увеличение:

    • 1% → 5% → 10% → 25% → 50% → 100%
    • На каждом этапе — проверка метрик

Пример Canary-анализа в Go

func shouldPromoteCanary() bool {
    mainStats := getServiceStats("main")
    canaryStats := getServiceStats("canary")

    // Проверяем, что ошибок не больше +5%
    if canaryStats.errorRate > mainStats.errorRate*1.05 {
        return false
    }

    // Проверяем, что latency не выше +15%
    if canaryStats.p99Latency > mainStats.p99Latency*1.15 {
        return false
    }

    return true
}

Отличия от других стратегий

Стратегия Трафик Откат Ресурсы Сложность
Canary Постепенно ↑ Частичный Средние Средняя
Blue-Green 100% переключение Полный Высокие Высокая
Rolling Update Постепенно ↑ Постепенный Низкие Низкая

Резюмируем

Canary-развертывания — это золотая середина между:

  • Безопасностью (как Blue-Green)
  • Эффективностью использования ресурсов (как Rolling Update)

Идеально подходит для:

  • Высоконагруженных сервисов
  • Систем, где важна бесперебойная работа
  • Команд, которые хотят data-driven подход к релизам

Главное преимущество — возможность обнаружить проблемы до того, как они затронут всех пользователей.