Kubernetes/Kubernetes Advanced

📌 [Deployment 심화편 #4] Deployment와 Canary Deployment: 점진적 배포 전략

ygtoken 2025. 3. 13. 10:23
728x90

 

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 버전을 제공할 수도 있음

배포 후 반드시 모니터링을 수행하여 에러율이 증가하면 즉시 롤백해야 함

728x90