아르고 롤아웃과 이스티오 연계

개요

아르고 롤아웃의 트래픽 관리 제공자로 이스티오를 사용할 때, 두 가지 방법을 사용할 수 있다.
이 문서는 각 방법에 대해서 간단하게 다룬다.

호스트 레벨 트래픽 분할

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-example
spec:
  ...
  strategy:
    canary:
      canaryService: canary-svc  # 카나리를 가리킬 서비스
      stableService: stable-svc  # 기본을 가리킬 서비스
      trafficRouting:
        istio:
          virtualService: # 버츄얼 서비스
            name: rollout-vsvc   
            routes:
            - primary            # 해당 서비스에 여러 라우트가 있을 경우 명시해야 함
      steps:
      - setWeight: 5
      - pause:
          duration: 10m

이건 기본적으로 다른 제공자와 똑같이 쓰는 방식이다.
일단 두 가지 서비스를 만들고, 이 서비스들에 라우팅을 하는 버츄얼 서비스를 만든다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: rollout-vsvc
spec:
gateways:
- istio-rollout-gateway
hosts:
- istio-rollout.dev.argoproj.io
http:
- name: primary        # 롤아웃 routes 부분에 나오는 이름
	route:
	- destination:
		host: stable-svc # 스테이블 서비스
	weight: 100
	- destination:
		host: canary-svc # 카나리 서비스
	weight: 0

버츄얼 서비스는 이런 식으로 만들어주면 된다.
가중치는 위와 같이 세팅해두면 나중에 배포가 진행될 때 롤아웃이 알아서 이걸 조정할 것이다.

부분집합 레벨 트래픽 분할

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-example
spec:
  ...
  strategy:
    canary:
      trafficRouting:
        istio:
          virtualService:
            name: rollout-vsvc        
            routes:
            - primary                 # 위와 마찬가지
          destinationRule:
            name: rollout-destrule    # 데스티네이션 룰 이름
            canarySubsetName: canary  # 룰 안에 부분집합의 이름을 넣어야 한다.
            stableSubsetName: stable  
      steps:
      - setWeight: 5
      - pause:
          duration: 10m

이 방식은 이스티오의 이스티오 데스티네이션룰의 부분집합 분할 기능을 이용한다.
여기에서는 서비스를 명시할 필요가 없는데, 모든 트래픽 관리가 버츄얼 서비스 수준에서 해결될 수 있기 때문이다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: rollout-vsvc
spec:
  gateways:
  - istio-rollout-gateway
  hosts:
  - istio-rollout.dev.argoproj.io
  http:
  - name: primary       # 위와 마찬가지
    route:
    - destination:
        host: rollout-example
        subset: stable  # 롤아웃의 서브셋 이름과 같아야 한다.
      weight: 100
    - destination:
        host: rollout-example
        subset: canary  #
      weight: 0

세팅 자체는 비슷하다.
각 서비스마다 레플리카셋의 고유 라벨(pod-template-hash)을 달아서 수정해주던 기존 방식과 달리 이 방식에서 아르고 롤아웃은 오직 데스티네이션 룰의 라벨 셀렉터에 조작을 가한다.

비교

이 두 방법은 사용성에 있어서 크게 다른 것은 없다.
다만 호스트 레벨 방법의 경우, 스테이블 서비스와 카나리 서비스는 클러스터 내부에서 다른 dns 이름을 가지므로 동서 트래픽 용으로 사용한다면 버츄얼 서비스가 반드시 서비스 메시 내의 엔보이들을 대상으로 삼을 필요가 있다.
이렇게 완전히 클러스터 안 속에서 사용하는 케이스라면 부분집합 레벨을 사용하는 것이 유용하다.

그렇지만 메트릭의 관점에서는 조금 더 커스터마이징이 필요하다는 점이 번거로울 수 있다.
보통의 모니터링 툴들은 쿠버 서비스 단위의 메트릭을 제공하는 경우가 많은데, 부분집합 방식에서 스테이블과 카나리로 가는 트래픽을 구분짓기 위해서는 라벨을 이용해 추가 커스텀을 해야만 한다.

관련 문서

이름 noteType created
아르고 롤아웃과 이스티오 연계 knowledge 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 published 2025-04-22

참고