Kubernetes/Kubernetes Advanced

📌 [Deployment 심화편 #6] Deployment와 Shadow Deployment: 트래픽 미러링을 활용한 배포 전략

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

 

1️⃣ 개요

 

실제 운영 환경에서 새로운 애플리케이션 버전이 예상과 다르게 동작할 가능성이 있습니다.

특히, 새로운 버전이 기존 시스템과 잘 동작하는지 검증하는 것이 중요하지만, Canary나 Blue-Green 방식으로 배포하더라도 실제 사용자 요청을 받으면서 테스트하기에는 위험이 따릅니다.

 

이때 활용할 수 있는 배포 전략이 Shadow Deployment(섀도우 배포) 입니다.

Shadow Deployment는 실제 트래픽을 복제하여 새로운 버전에 전달하면서도, 사용자의 응답에는 영향을 주지 않는 방식입니다.

이를 통해 실제 트래픽을 기반으로 새로운 버전을 검증할 수 있으며, 문제 발생 시 서비스에 영향을 주지 않고 분석할 수 있습니다.

 

이번 글에서는 Shadow Deployment의 개념과, 쿠버네티스 환경에서 트래픽 미러링을 활용하여 적용하는 방법을 설명하겠습니다. 🚀

 


2️⃣ Shadow Deployment란?

 

✅ 1. Shadow Deployment의 개념

운영 중인 애플리케이션(Stable 버전)으로 정상적으로 트래픽을 전달하면서, 동일한 트래픽을 새로운 버전(Shadow 버전)에도 복제하여 전달

새로운 버전이 실제 환경에서 어떻게 동작하는지 미리 테스트 가능

Shadow 버전에서 발생하는 오류나 성능 이슈를 감지할 수 있음

사용자 응답에는 영향을 주지 않으므로 안전한 테스트가 가능

 

📌 Shadow Deployment vs Canary Deployment vs Blue-Green 비교

 

특징 Shadow Deployment Canary Deployment Blue-Green Deployment
배포 방식 실제 트래픽을 복제하여 테스트 일부 트래픽에만 새로운 버전 배포 기존 버전과 새로운 버전을 동시에 운영 후 트래픽 전환
서비스 응답 영향 🚫 없음 ✅ 있음 ✅ 있음
실제 데이터 기반 테스트 ✅ 가능 ✅ 가능 (일부 트래픽만) 🚫 없음 (트래픽 전환 후 확인 가능)
롤백 용이성 🚫 필요 없음 (테스트 목적) ✅ 트래픽 비율만 조정 ✅ 기존 버전으로 즉시 전환 가능

Shadow Deployment는 새로운 버전을 실사용 트래픽으로 테스트하면서도, 사용자 응답에는 영향을 주지 않는 방식입니다.

 


3️⃣ Shadow Deployment 적용 방법

 

Shadow Deployment는 트래픽을 복제하여 두 개의 버전(Stable & Shadow)에 동시에 전달하는 방식으로 구현됩니다.

이를 위해 Service 및 Ingress에서 트래픽 미러링(Mirroring)을 활용합니다.

 


✅ 1. Stable Deployment (운영 중인 버전) 생성

 

먼저, 기존 운영 버전(Stable)을 배포합니다.

 

📌 Stable Deployment YAML (기존 버전, nginx:1.0)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-stable
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
      version: stable
  template:
    metadata:
      labels:
        app: my-app
        version: stable
    spec:
      containers:
        - name: my-container
          image: nginx:1.0

 

📌 Stable Deployment 배포

kubectl apply -f stable-deployment.yaml

이제 Stable 버전이 운영 환경에서 실행 중입니다.

 


✅ 2. Shadow Deployment (새로운 버전) 생성

 

새로운 버전(Shadow)을 Stable과는 별도로 배포합니다.

 

📌 Shadow Deployment YAML (새로운 버전, nginx:1.1)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-shadow
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
      version: shadow
  template:
    metadata:
      labels:
        app: my-app
        version: shadow
    spec:
      containers:
        - name: my-container
          image: nginx:1.1

📌 Shadow Deployment 배포

kubectl apply -f shadow-deployment.yaml

이제 Stable 버전과 Shadow 버전이 동시에 운영됩니다.

 


✅ 3. 트래픽 미러링을 활용한 Shadow Deployment 적용

 

이제 Service를 통해 Stable 버전은 정상적으로 요청을 처리하고, 동일한 트래픽을 Shadow 버전에도 복제합니다.

 

📌 Service를 활용한 트래픽 미러링 (Stable → Shadow 트래픽 복제)

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
    version: stable  # 기존 Stable 버전과 연결
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  sessionAffinity: None

 

📌 Ingress를 활용하여 Shadow 트래픽 미러링 설정 (Istio 사용 시 적용 가능)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-app
spec:
  hosts:
    - my-app.example.com
  http:
    - route:
        - destination:
            host: my-app-service
            subset: stable  # Stable 버전으로 트래픽 전달
      mirror:
        host: my-app-service
        subset: shadow  # Shadow 버전에도 동일한 트래픽 복제
      mirrorPercentage: 100.0  # 모든 트래픽을 Shadow에도 복제

 

📌 Ingress 적용

kubectl apply -f ingress-shadow.yaml

이제 Stable 버전과 Shadow 버전이 동일한 요청을 받지만, Shadow 버전의 응답은 실제 사용자에게 반환되지 않습니다.

 


4️⃣ Shadow Deployment 테스트 및 모니터링

 

✅ 1. Shadow 버전 Pod 로그 확인

 

📌 Stable 버전 Pod 로그 확인

kubectl logs -l version=stable

 

📌 Shadow 버전 Pod 로그 확인

kubectl logs -l version=shadow

두 버전의 로그를 비교하여 새로운 버전이 정상적으로 동작하는지 확인할 수 있습니다.

 


✅ 2. 트래픽 분석을 위한 모니터링 설정

Shadow 버전이 예상대로 동작하는지 분석하기 위해 Prometheus, Grafana, ELK 스택 등을 활용

Shadow 버전에서 발생하는 에러율 및 성능 비교

 

📌 Shadow 버전 Pod 상태 확인

kubectl get pods -l version=shadow

트래픽이 정상적으로 Shadow 버전에 복제되고 있는지 반드시 모니터링해야 합니다.

 


🔥 5️⃣ 결론

 

Shadow Deployment는 실제 운영 트래픽을 복제하여 새로운 버전을 안전하게 테스트할 수 있는 배포 전략

Stable 버전과 Shadow 버전을 동시에 운영하며, 트래픽 미러링을 활용하여 검증 가능

Shadow 버전의 응답은 사용자에게 반환되지 않으므로, 장애 발생 시에도 서비스에는 영향 없음

Ingress 또는 Service 설정을 활용하여 트래픽 미러링을 적용 가능

배포 후 반드시 모니터링을 수행하여 새로운 버전의 성능 및 안정성을 분석해야 함

728x90