Canary 배포

신규 버전을 전체가 아닌 일부 트래픽에만 먼저 노출해 위험을 최소화하며 점진적으로 릴리즈하는 배포 전략입니다.

개념

이름의 유래: 광부들이 탄광에서 카나리아 새를 데려가 유해가스를 먼저 감지했던 것처럼, 일부 사용자를 먼저 노출시켜 문제를 조기에 감지합니다.

[Canary 배포 흐름]

1단계: 95% 구버전 / 5% 신버전
         ┌──────────────────┐
트래픽 ──┤  Load Balancer   │
         └──────────────────┘
              │         │
           95%│       5%│
              ▼         ▼
         [v1.0 Pod]  [v2.0 Pod]  ← Canary

2단계: 이상 없으면 점진적으로 비율 증가
         20% → 50% → 100%

3단계: 문제 발생 시 즉시 0%로 롤백

Blue-Green vs Canary vs Rolling

항목Blue-Green 배포Canary 배포Rolling Update
전환 방식즉시 100% 전환점진적 비율 증가Pod 하나씩 교체
롤백 속도즉시 (트래픽 스위칭)즉시 (비율 0으로)느림
리소스 비용2배소량 추가거의 없음
위험도낮음가장 낮음중간
실시간 검증불가가능불가

Kubernetes에서 Canary 구현

# 구버전 Deployment (replicas: 9)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cslog-backend-stable
spec:
  replicas: 9
  selector:
    matchLabels:
      app: cslog-backend
      track: stable
  template:
    metadata:
      labels:
        app: cslog-backend
        track: stable
    spec:
      containers:
        - name: backend
          image: cslog/backend:1.0.0
---
# Canary Deployment (replicas: 1) → 전체의 10%
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cslog-backend-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cslog-backend
      track: canary
  template:
    metadata:
      labels:
        app: cslog-backend
        track: canary
    spec:
      containers:
        - name: backend
          image: cslog/backend:2.0.0
---
# Service — label app: cslog-backend 기준으로 양쪽 Pod에 분산
apiVersion: v1
kind: Service
metadata:
  name: cslog-backend-svc
spec:
  selector:
    app: cslog-backend   # track 무관하게 두 Deployment 모두 포함

언제 사용하나?

핵심 지표 모니터링 (RED)

Canary Pod 배포 후 확인:
- Rate:   초당 요청 수 이상 없는지
- Errors: 에러율 증가 없는지
- Duration: 응답 시간 급증 없는지

→ Grafana & Loki로 실시간 확인
→ 이상 감지 시 canary replicas: 0으로 즉시 롤백

CSLOG에서 보기