쿠버네티스 환경에서 애플리케이션의 새로운 버전을 배포할 때, 기존 트래픽을 중단 없이 새로운 버전으로 전환하는 것이 중요합니다.
이를 위해 Canary 배포 및 Blue-Green 배포 전략을 적용하여 점진적으로 트래픽을 전환하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. Canary 배포를 활용하여 트래픽을 점진적으로 전환하는 방법
2. Blue-Green 배포를 활용하여 빠르게 롤백할 수 있는 구조 구성
3. kubectl을 활용한 배포 상태 확인 및 트래픽 전환 검증
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ Canary 배포를 활용하여 트래픽을 점진적으로 전환하는 방법
❓ 문제 상황
운영팀에서 애플리케이션을 신규 버전(v2)으로 업데이트해야 하지만, 전체 트래픽을 한 번에 전환하기에는 위험이 따릅니다.
따라서 Canary 배포 전략을 적용하여 10%의 트래픽만 신규 버전(v2)으로 보내고, 안정성을 확인한 후 전체 전환 여부를 결정해야 합니다.
• 기존 버전: v1
• 신규 버전: v2
• 초기 트래픽 비율: 90% (v1) / 10% (v2)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Deployment를 기존(v1)과 신규(v2)로 나누어 생성합니다.
2. 서비스(서비스 셀렉터)를 활용하여 Canary 트래픽을 분할합니다.
✅ 정답 Manifest (Canary 배포 설정)
🔹 기존(v1) 버전 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-v1
spec:
replicas: 9 # 전체 트래픽의 90% 유지
selector:
matchLabels:
app: web-app
version: v1
template:
metadata:
labels:
app: web-app
version: v1
spec:
containers:
- name: web-container
image: my-app:v1
🔹 신규(v2) 버전 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-v2
spec:
replicas: 1 # 초기 Canary 트래픽 10% 유지
selector:
matchLabels:
app: web-app
version: v2
template:
metadata:
labels:
app: web-app
version: v2
spec:
containers:
- name: web-container
image: my-app:v2
🔹 트래픽을 분할하는 서비스 설정
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
✅ 이제 전체 트래픽 중 10%는 신규 버전(v2)으로 전달됨
📌 적용 후 예상 결과 값
1. 현재 배포 상태 확인
kubectl get deployments
💡 예상 출력 값
NAME READY UP-TO-DATE AVAILABLE AGE
web-app-v1 9/9 9 9 5m
web-app-v2 1/1 1 1 1m
2. 트래픽을 확인하기 위한 요청 실행
for i in {1..20}; do curl http://web-app-service; done
💡 예상 출력 값 (90% v1, 10% v2)
Response from v1
Response from v1
Response from v1
Response from v2 # 일부 요청이 v2로 전달됨
Response from v1
...
✅ Canary 배포가 정상적으로 적용됨
2️⃣ Blue-Green 배포를 활용하여 빠르게 롤백할 수 있는 구조 구성
❓ 문제 상황
운영팀에서 애플리케이션의 새로운 버전(v2)을 배포하고 기존 버전(v1)과 동시에 운영하다가, 정상 동작이 확인되면 한 번에 전환하고자 합니다.
이 전략을 적용하면 트래픽 전환을 즉시 수행할 수 있으며, 문제가 발생하면 빠르게 롤백할 수 있습니다.
• 기존 버전: v1
• 신규 버전: v2
• 트래픽 전환: v1 → v2
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. 기존 버전(v1)과 신규 버전(v2)을 각각 별도의 Deployment로 실행합니다.
2. Ingress 또는 Service를 사용하여 트래픽을 한 번에 전환할 수 있도록 구성합니다.
✅ 정답 Manifest (Blue-Green 배포 설정)
🔹 기존(v1) 버전 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-v1
spec:
replicas: 3
selector:
matchLabels:
app: web-app
version: v1
template:
metadata:
labels:
app: web-app
version: v1
spec:
containers:
- name: web-container
image: my-app:v1
🔹 신규(v2) 버전 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-v2
spec:
replicas: 3
selector:
matchLabels:
app: web-app
version: v2
template:
metadata:
labels:
app: web-app
version: v2
spec:
containers:
- name: web-container
image: my-app:v2
🔹 서비스(트래픽 전환) 설정
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
version: v1 # v2로 변경하면 새로운 버전으로 트래픽 전환됨
ports:
- protocol: TCP
port: 80
targetPort: 8080
✅ 이제 v1에서 v2로 트래픽을 한 번에 전환 가능
📌 적용 후 예상 결과 값
1. 현재 실행 중인 버전 확인
kubectl get deployments
💡 예상 출력 값
NAME READY UP-TO-DATE AVAILABLE AGE
web-app-v1 3/3 3 3 10m
web-app-v2 3/3 3 3 1m
2. 트래픽을 v2로 전환
kubectl patch service web-app-service -p '{"spec":{"selector":{"app":"web-app", "version":"v2"}}}'
💡 예상 출력 값
service/web-app-service patched
✅ 트래픽이 v2로 전환됨