Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #6] 애플리케이션 배포 중 트래픽 스위칭 (Canary & Blue-Green 배포)

ygtoken 2025. 3. 16. 18:57
728x90

 

쿠버네티스 환경에서 애플리케이션의 새로운 버전을 배포할 때, 기존 트래픽을 중단 없이 새로운 버전으로 전환하는 것이 중요합니다.

이를 위해 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로 전환됨

 

728x90