1️⃣ 개요
쿠버네티스에서 애플리케이션을 운영할 때, 새로운 버전이 실제 환경에서 안정적인지 충분히 검증한 후 전체 배포하는 것이 중요합니다.
이를 위해 Canary Deployment(카나리 배포) 를 활용하면, 일부 사용자에게만 새로운 버전을 먼저 제공하여 문제가 없는지 확인한 후 점진적으로 배포할 수 있습니다.
이번 글에서는 Canary Deployment의 개념과, 쿠버네티스 Deployment를 활용한 실전 적용 방법을 설명하겠습니다. 🚀
2️⃣ Canary Deployment란?
✅ 1. Canary Deployment의 개념
• 새로운 애플리케이션 버전을 일부 트래픽에만 먼저 적용하여 검증
• 일정 시간이 지나고 문제가 없으면 전체 트래픽으로 확장
• 장점: 배포 중 문제가 발생해도 전체 서비스에 영향을 주지 않고 쉽게 롤백 가능
📌 Canary Deployment vs Rolling Update 비교
특징 | Rolling Update | Canary Deployment |
배포 방식 | 기존 버전을 점진적으로 교체 | 새로운 버전을 일부 트래픽에만 적용 |
무중단 배포 | ✅ 가능 | ✅ 가능 |
리스크 최소화 | 🚫 기존 버전도 점진적으로 제거됨 | ✅ 기존 버전과 병행 운영 가능 |
롤백 용이성 | 🚫 일부 Pod가 교체되면 롤백 어려움 | ✅ 트래픽 비율만 조정하면 됨 |
✅ Canary Deployment는 새로운 버전을 점진적으로 배포하여 리스크를 최소화하는 전략입니다.
3️⃣ Canary Deployment 적용 방법
Canary Deployment를 구현하는 대표적인 방법은 Deployment의 ReplicaSet을 활용하여 두 개의 버전을 동시에 운영하는 방식입니다.
이를 위해 Deployment의 replicas 수를 조정하거나, Ingress/Service를 사용하여 트래픽을 제어할 수 있습니다.
✅ 1. Deployment를 활용한 Canary Deployment
먼저, 기존 버전과 새로운 버전을 동시에 운영하도록 설정해야 합니다.
📌 기존 버전 Deployment (Stable 버전, 80% 트래픽 배포)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-stable
spec:
replicas: 4 # 전체 트래픽의 80%를 담당
selector:
matchLabels:
app: my-app
version: stable
template:
metadata:
labels:
app: my-app
version: stable
spec:
containers:
- name: my-container
image: nginx:1.0
📌 Canary 버전 Deployment (20% 트래픽 배포)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-canary
spec:
replicas: 1 # 전체 트래픽의 20%를 담당
selector:
matchLabels:
app: my-app
version: canary
template:
metadata:
labels:
app: my-app
version: canary
spec:
containers:
- name: my-container
image: nginx:1.1 # 새로운 버전
✅ 이 설정을 적용하면 기존 버전(Stable)과 새로운 버전(Canary)이 함께 운영됩니다.
✅ 2. Service를 사용하여 Canary 트래픽 라우팅
두 개의 Deployment를 배포한 후, Service에서 두 버전의 Pod에 트래픽을 분배해야 합니다.
📌 Service에서 Canary 배포 지원
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app # 두 버전의 Pod를 선택
ports:
- protocol: TCP
port: 80
targetPort: 80
📌 트래픽 비율을 조정하려면 kubectl scale을 사용하여 replicas 값을 변경
kubectl scale deployment my-app-stable --replicas=3 # 75% 트래픽
kubectl scale deployment my-app-canary --replicas=1 # 25% 트래픽
✅ 이 방법을 활용하면 트래픽 비율을 동적으로 조정할 수 있습니다.
4️⃣ Canary Deployment의 단계별 확장 전략
Canary Deployment는 일정한 단계별 확장 전략을 적용하는 것이 중요합니다.
📌 Canary Deployment 진행 단계 예시
단계 | Stable 버전 트래픽 비율 | Canary 버전 트래픽 비율 | 설명 |
Step 1 | 100% | 0% | 기존 버전만 운영 |
Step 2 | 80% | 20% | Canary 버전 배포 후 테스트 |
Step 3 | 50% | 50% | Canary 버전 안정성 확인 |
Step 4 | 0% | 100% | Canary 버전을 Stable 버전으로 승격 |
✅ 문제가 발생하면 Canary 버전의 replicas를 0으로 설정하여 즉시 롤백할 수 있습니다.
5️⃣ Canary Deployment 적용 시 고려해야 할 점
✅ 1. Canary 배포 테스트 대상 설정
Canary Deployment는 특정 사용자 그룹에만 적용할 수도 있습니다.
예를 들어, 지역, IP, User-Agent, 쿠키 값 등을 기준으로 Canary 버전을 사용하는 사용자 그룹을 설정할 수 있습니다.
📌 예제: 특정 IP 범위만 Canary 버전 사용
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
backend:
service:
name: my-app-service
port:
number: 80
matchLabels:
app: my-app
version: canary
sourceIP: "192.168.1.0/24"
✅ 이 설정을 활용하면 Canary 배포를 특정 사용자 그룹에게만 제공할 수 있습니다.
✅ 2. Canary 트래픽 모니터링
• Canary 버전이 예상대로 동작하는지 모니터링이 필수적
• Prometheus, Grafana, ELK 스택을 활용하여 실시간 트래픽과 에러율을 확인
• Canary 버전에서 문제가 발생하면 즉시 Stable 버전으로 롤백
📌 배포된 Pod의 로그 확인
kubectl logs -l version=canary
📌 Canary 버전 Pod의 상태 확인
kubectl get pods -l version=canary
✅ Canary Deployment를 운영할 때는 반드시 모니터링을 병행해야 합니다.
🔥 6️⃣ 결론
✔ Canary Deployment를 사용하면 일부 사용자에게만 새로운 버전을 먼저 제공하여 리스크를 최소화할 수 있음
✔ Deployment를 활용하여 Stable 버전과 Canary 버전을 동시에 운영하며 트래픽을 점진적으로 조정 가능
✔ 트래픽을 조정하면서 특정 사용자 그룹에게만 Canary 버전을 제공할 수도 있음
✔ 배포 후 반드시 모니터링을 수행하여 에러율이 증가하면 즉시 롤백해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Deployment 심화편 #6] Deployment와 Shadow Deployment: 트래픽 미러링을 활용한 배포 전략 (0) | 2025.03.13 |
---|---|
📌 [Deployment 심화편 #5] Deployment와 Blue-Green Deployment: 안전한 배포 전략 (0) | 2025.03.13 |
📌 [Deployment 심화편 #3] Deployment와 Rolling Update: 무중단 배포 전략 (0) | 2025.03.13 |
📌 [Deployment 심화편 #2] Deployment의 동작 원리와 트러블슈팅 (0) | 2025.03.13 |
📌 [Deployment 심화편 #1] Deployment의 역할과 실무 활용 방법 (0) | 2025.03.13 |