Канареечные деплои
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 оценивает канарейки
- Сбор метрик с канареечной и базовой версий за окно анализа
- Сравнение распределений с помощью теста Манна-Уитни (непараметрический)
- Оценка каждой метрики как Прошла, Пограничная или Провалена
- Применение весов групп (Ошибки 40%, Задержка 35%, Насыщение 25%)
- Вычисление финальной оценки (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 часов (рассмотрите дополнение синтетическим трафиком)
Какие метрики сравнивать?
Как минимум, сравнивайте между канарейкой и базовой версией:
- Доля ошибок (критично — всегда включайте)
- Перцентили задержки (p50, p95, p99)
- Метрики насыщения (CPU, память на под)
- Бизнес-метрики (конверсия, доход на запрос — если доступны в реальном времени)
Распространённые ошибки канареечных деплоев
| Ошибка | Проблема | Решение |
|---|---|---|
| Недостаточный трафик | Невозможно достичь статистической значимости | Увеличьте процент канарейки или окно наблюдения |
| Проверка только средних | Маскирует регрессии хвостовой задержки | Сравнивайте p95 и p99, а не только среднее |
| Нет автоматического отката | Задержка человека позволяет затронуть больше пользователей | Настройте автоматический откат по порогу метрик |
| Игнорирование бизнес-метрик | Технически быстро, но функционально сломано | Включите конверсию и число ошибок в канареечный анализ |
| Канарейка той же версии | Канарейка всегда проходит, потому что идентична базовой | Убедитесь, что канарейка действительно запускает новую версию |
| Эффекты прогрева кеша | Канарейка начинает медленно из-за холодных кешей | Предоставьте период прогрева перед началом сравнения метрик |
Чек-лист канареечного деплоя
Перед включением канареечных деплоев:
- Пайплайн метрик может дифференцировать трафик по версиям (метки, заголовки или идентификатор пода)
- Автоматический откат настроен (не только ручное вмешательство)
- Окно анализа достаточно длинное для вашего объёма трафика
- И канарейка, и базовая версия мониторятся одними и теми же дашбордами
- Маршрутизация алертов учитывает канареечные сбои (не вызывайте дежурного для ожидаемых экспериментов)
- Команда понимает, что откат — это успех, а не провал: вы обнаружили проблему до того, как она достигла всех пользователей