Canary-развертывание — это стратегия постепенного внедрения изменений в production, при которой новая версия приложения сначала развертывается для небольшой части пользователей/трафика, чтобы проверить её стабильность и корректность работы перед полным rollout'ом.
Название происходит из шахтерской практики, где канареек использовали для обнаружения опасных газов в шахтах.
Развертывание новой версии:
Мониторинг и анализ:
Принятие решения:
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
✅ Минимизация риска - проблемы затрагивают только малый % пользователей
✅ Реальное тестирование - проверка в реальной production-среде
✅ Гибкость - можно быстро откатить или увеличить трафик
✅ Data-driven решения - основано на реальных метриках
❌ Сложность реализации - требуется инфраструктура для разделения трафика
❌ Мониторинг - нужны хорошие инструменты для сравнения версий
❌ Stateful сервисы - сложно реализовать для систем с состоянием
Автоматизированные проверки:
Продолжительность:
Градуальное увеличение:
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-развертывания — это золотая середина между:
Идеально подходит для:
Главное преимущество — возможность обнаружить проблемы до того, как они затронут всех пользователей.