Zone-Aware Argo Rollouts

지원 버전: Istio 1.18+, Argo Rollouts 1.6+ 마지막 업데이트: 2026년 2월 19일 난이도: ⭐⭐⭐⭐⭐ (고급)

이 문서는 AWS 가용 영역(Availability Zone)별로 독립적인 Argo Rollouts Canary 배포를 설정하면서, Istio의 locality-aware 라우팅을 활용하여 자동 failover를 구현하는 방법을 설명합니다.

목차

문제 정의

실제 사용 사례: Spot Instance 환경에서의 PDB 관리

배경: AWS Spot Instance를 사용하는 환경에서는 특정 가용 영역(Zone)의 모든 노드가 갑자기 중단될 수 있습니다.

문제 시나리오:

spinner

왜 Zone별 Rollout이 필요한가?

  1. Rollout당 독립적인 PDB 관리

    • 각 Zone의 Rollout이 자체 PDB를 관리

    • Zone C가 완전히 사라져도 Zone A, B의 PDB는 영향 없음

  2. Zone 단위 복구

    • Zone C가 복구되면 해당 Rollout만 재시작

    • 다른 Zone의 배포 상태에 영향 없음

  3. Spot Instance 중단 대응

    • 특정 Zone의 Spot Instance가 모두 중단되어도

    • 다른 Zone의 서비스는 계속 운영

    • Istio locality failover로 자동 트래픽 전환

PDB 설정 예시 (Zone별):

장점:

  • Zone C 전체 중단 시에도 Zone A, B의 PDB는 정상 동작

  • 각 Zone이 독립적으로 복구 가능

  • Canary 배포도 Zone별로 독립적으로 진행

요구사항

  1. Zone별 독립 배포: 3개의 가용 영역(a, b, c)에 각각 독립적인 Canary 배포

  2. Zone 격리: 각 zone의 트래픽은 기본적으로 해당 zone 내에서만 처리

  3. Failover 전용: 장애 발생 시에만 다른 zone으로 트래픽 전환 (a→b, b→c, c→a)

  4. 통합 호출: 클라이언트는 단일 서비스 이름으로 호출

  5. Spot Instance 대응: Zone 단위 중단에도 서비스 연속성 보장

일반적인 문제

문제: 여러 Argo Rollouts가 같은 VirtualService를 참조하면 충돌 발생

해결책: Zone별 별도 route를 사용한 분리

중요: Argo Rollouts는 지정된 route 이름의 전체 destinations 배열을 관리합니다. 따라서 여러 Rollout이 같은 route 이름을 참조하면, 각 Rollout이 서로의 설정을 덮어쓰게 됩니다. subset을 다르게 설정해도 충돌이 발생합니다.

아키텍처 개요

전체 구조

spinner

핵심 컴포넌트

  1. 단일 VirtualService: 모든 zone의 트래픽 라우팅 규칙 정의

  2. Zone별 Rollout: 각 zone에서 독립적인 Canary 배포 관리

  3. Subset 기반 분리: 각 Rollout은 고유한 subset 쌍 관리 (stable-a/canary-a 등)

  4. Locality-aware DestinationRule: 자동 zone-local 라우팅 및 failover

핵심 설계 결정

1. 단일 VirtualService + Zone별 Route 분리

왜 이 방식이 필요한가?

Argo Rollouts는 지정된 route 이름의 전체 destinations 배열을 덮어쓰는 방식으로 동작합니다. 따라서 각 Zone의 Rollout이 독립적인 route 이름을 관리해야 충돌이 발생하지 않습니다:

핵심 원리:

  • 각 Rollout은 서로 다른 route 이름을 참조 (zone-a-route, zone-b-route, zone-c-route)

  • 각 route는 sourceLabels match를 통해 해당 Zone의 트래픽만 처리

  • Locality-aware 라우팅이 자동으로 zone-local 엔드포인트를 우선 선택

2. Locality-aware 라우팅

기본 동작:

  • Zone A의 클라이언트 → Zone A의 Pod (100%)

  • Zone B의 클라이언트 → Zone B의 Pod (100%)

  • Zone C의 클라이언트 → Zone C의 Pod (100%)

Failover 시:

  • Zone A 장애 → Zone B로 자동 전환

  • Zone B 장애 → Zone C로 자동 전환

  • Zone C 장애 → Zone A로 자동 전환

3. 통합 서비스 호출

클라이언트는 단일 DNS 이름 사용:

구현 가이드

1. 공통 Service 생성

중요: selector에 zone 레이블을 포함하지 마세요 (모든 zone의 Pod 선택)

2. Zone별 Rollout Service

각 Rollout이 관리하는 stable/canary Service:

3. Zone별 Route가 있는 단일 VirtualService

모든 zone의 트래픽을 처리하는 단일 VirtualService (Zone별 route 분리):

중요 변경사항:

  • ❌ 이전: 모든 Zone이 같은 primary route 공유 → 충돌 발생

  • ✅ 수정: 각 Zone이 독립적인 route 이름 사용 (zone-a-route, zone-b-route, zone-c-route)

  • ✅ 추가: sourceLabels.topology.kubernetes.io/zone match로 Zone별 트래픽 분리

동작 방식:

  1. Zone A의 파드에서 발생한 요청 → zone-a-route 매칭

  2. Rollout A는 zone-a-route의 weight만 수정 (다른 Zone 영향 없음)

  3. Locality-aware 라우팅이 자동으로 zone-local 엔드포인트 우선 선택

4. DestinationRule with Locality Settings

5. Zone별 Rollout 설정

Zone A Rollout

Zone B Rollout

Zone C Rollout

트래픽 흐름

정상 상태 (Zone-local 트래픽)

spinner

Failover 시나리오

spinner

Canary 배포 중 트래픽 흐름

spinner

문제 해결

1. VirtualService 충돌 오류

증상:

원인: 여러 Rollout이 같은 route를 동시에 수정 시도

해결:

2. Cross-zone 트래픽 발생

증상: Failover가 아닌데도 다른 zone으로 트래픽 전송

원인: distribute 설정이 잘못됨

해결:

3. Failover가 작동하지 않음

증상: Zone 장애 시에도 다른 zone으로 failover되지 않음

원인: Outlier detection이 비활성화되어 있거나 설정이 너무 느림

해결:

4. Rollout이 멈춤

증상: Canary 배포가 진행되지 않음

확인:

5. 디버깅 명령어

모범 사례

1. Rollout 동기화

문제: 여러 zone의 Rollout을 동시에 배포하면 복잡도 증가

권장:

2. Canary 분석

각 zone별로 독립적인 분석 수행:

3. 점진적 Rollout 단계

4. 자동 롤백

5. 모니터링 및 알림

Prometheus Alerts:

6. 배포 체크리스트

성능 고려사항

리소스 요구사항

Control Plane:

  • Istiod: CPU 500m, Memory 2GB (추가 VirtualService/DestinationRule로 인한 부하)

Data Plane:

  • Envoy Sidecar: CPU 100-500m, Memory 50-150MB (zone 정보 및 locality 라우팅 오버헤드)

Argo Rollouts Controller:

  • CPU 100m, Memory 128MB (3개 Rollout 관리)

네트워크 오버헤드

  • Zone-local 트래픽: 추가 latency 1-2ms (Envoy overhead)

  • Cross-zone 트래픽 (failover 시): 추가 latency 5-10ms (zone 간 네트워크)

참고 자료

관련 문서

외부 링크

다음 단계

  1. Multi-cluster로 확장하여 region 간 failover 구현

  2. Progressive Deliveryarrow-up-right로 자동화된 분석 및 롤백

마지막 업데이트