트래픽 분할

트래픽 분할은 Istio의 가장 강력한 기능 중 하나로, Canary 배포, A/B 테스트, Blue/Green 배포 등을 코드 변경 없이 구현할 수 있습니다.

목차

트래픽 분할 개요

트래픽 분할은 VirtualService의 weight 필드를 사용하여 여러 서비스 버전 간에 트래픽을 비율로 분배합니다.

spinner

기본 구조

Canary 배포

Canary 배포는 새 버전을 소수의 사용자에게만 먼저 배포하여 안전하게 검증하는 전략입니다. Argo Rollouts와 Istio를 함께 사용하면 자동화된 점진적 배포와 메트릭 기반 자동 롤백을 구현할 수 있습니다.

Argo Rollouts + Istio 아키텍처

spinner

Canary 배포 흐름

spinner

1단계: Argo Rollouts 설치

2단계: Rollout 리소스 정의

3단계: Service 생성

먼저 Kubernetes Service를 생성합니다:

4단계: VirtualService 정의

중요: Argo Rollouts는 VirtualService를 자동으로 수정하지 않습니다. VirtualService는 미리 생성되어 있어야 하며, Rollout은 이를 참조하여 가중치만 업데이트합니다.

주요 포인트:

  • http[].name 필드는 필수입니다 (Rollout의 routes 필드와 매칭)

  • Rollout은 이 VirtualService의 weight 값만 자동으로 업데이트합니다

  • 두 개의 destination이 필요합니다: stable과 canary

5단계: DestinationRule 정의

중요: Argo Rollouts는 DestinationRule을 자동으로 생성하지 않습니다. 반드시 미리 생성해야 합니다.

주요 포인트:

  • 서브셋 이름(stable, canary)은 Rollout의 stableSubsetName, canarySubsetName과 일치해야 합니다

  • Rollout은 Pod에 rollouts-pod-template-hash 레이블을 자동으로 추가합니다

  • DestinationRule의 서브셋은 이 레이블을 기반으로 Pod를 선택합니다

  • 레이블 셀렉터는 비워둡니다 - Rollout이 런타임에 관리합니다

6단계: AnalysisTemplate 정의

성공률 분석

지연시간 분석

배포 실행 및 모니터링

새 버전 배포

수동 승인/거부

배포 진행 상황 모니터링

고급 설정: 메트릭 기반 자동 진행

주요 주의사항

1. VirtualService와 DestinationRule 미리 생성 필수

Argo Rollouts는 이 리소스들을 생성하지 않습니다. 반드시 Rollout 배포 전에 미리 생성해야 합니다:

2. Rollout이 관리하는 레이블

Argo Rollouts는 다음 레이블을 자동으로 추가/관리합니다:

이 레이블은 DestinationRule의 서브셋 선택에 사용됩니다.

3. HTTP Route Name 필수

VirtualService의 각 HTTP route에는 반드시 name 필드가 있어야 합니다:

4. Istio Injection 활성화

Rollout의 Pod에 Istio sidecar가 주입되어야 합니다:

VirtualService Match와 함께 사용하기

Argo Rollouts는 VirtualService의 match 조건과 함께 사용할 수 있습니다. 이를 통해 특정 조건을 만족하는 트래픽만 Canary로 라우팅할 수 있습니다.

예제 1: 헤더 기반 Canary (내부 테스터용)

사용 시나리오:

예제 2: 지역 기반 단계적 배포

Rollout 설정:

예제 3: 사용자 등급별 배포

예제 4: 모바일 앱 버전별 배포

완전한 배포 예제

모든 리소스를 한 번에 배포하는 기본 예제:

Match와 함께 사용 시 주의사항

1. Route 순서가 중요

VirtualService의 HTTP route는 순서대로 평가됩니다. match가 있는 route는 Rollout이 관리하는 route보다 먼저 배치해야 합니다:

2. Rollout은 지정된 Route만 관리

Rollout은 routes 필드에 지정된 route의 weight만 수정합니다:

3. 여러 Route를 동시에 관리

필요한 경우 여러 route를 동시에 관리할 수 있습니다:

문제 해결

Rollout이 Progressing 상태에서 멈춤

트래픽이 Canary로 가지 않음

Rollout 롤백

Blue/Green 배포와 Argo Rollouts

Argo Rollouts는 Blue/Green 전략도 지원합니다:

Blue/Green 배포

Blue/Green 배포는 두 개의 동일한 프로덕션 환경을 유지하고, 순간적으로 트래픽을 전환합니다. Argo Rollouts와 Istio를 함께 사용하면 안전한 전환과 자동 롤백을 구현할 수 있습니다.

Argo Rollouts Blue/Green 아키텍처

spinner

Blue/Green 배포 흐름

spinner

1단계: Service 정의

Blue/Green 배포에는 두 개의 Service가 필요합니다:

2단계: Istio Gateway 및 VirtualService

3단계: Rollout 리소스 정의

4단계: AnalysisTemplate 정의

사전 테스트 (Smoke Tests)

사후 검증 테스트

배포 실행 및 관리

새 버전 배포

수동 승인 (Promotion)

상태 확인

롤백

A/B 테스트

A/B 테스트는 두 가지 버전을 동시에 실행하고, 특정 기준으로 사용자를 분류하여 효과를 측정합니다.

spinner

Header 기반 A/B 테스트

지역 기반 A/B 테스트

점진적 롤아웃

점진적 롤아웃은 시간에 따라 자동으로 트래픽 비율을 증가시킵니다. Argo Rollouts의 Canary 전략을 사용하면 자동화된 점진적 배포를 구현할 수 있습니다.

수동 점진적 롤아웃

트래픽 미러링과 함께 사용

트래픽 분할과 미러링을 결합하여 더 안전한 배포를 할 수 있습니다.

실전 예제

예제 1: 사용자 세그먼트별 배포

예제 2: 시간대별 배포

예제 3: 마이크로서비스 연쇄 Canary

모니터링 및 롤백

Prometheus 쿼리

자동 롤백 스크립트

문제 해결

트래픽 분할이 작동하지 않음

Weight가 예상과 다르게 동작

모범 사례

1. 단계적 롤아웃

2. 롤백 계획 준비

3. 모니터링 필수

  • Golden Signals 모니터링: Latency, Traffic, Errors, Saturation

  • SLO 기반 의사 결정: 목표 SLO 미달 시 자동 롤백

  • 실시간 알림: Slack, PagerDuty 등으로 알림 설정

4. 테스트 자동화

Argo Rollouts의 AnalysisTemplate을 사용하여 자동화된 테스트 및 검증을 구현할 수 있습니다:

5. 문서화

참고 자료

Istio 관련

Argo Rollouts 관련

Progressive Delivery

마지막 업데이트