Argo Rollouts란?

Argo Rollouts는 Kubernetes에서 고급 배포 전략(Canary, Blue-Green 등)을 구현할 수 있도록 도와주는 배포 관리 컨트롤러입니다. 기본 Kubernetes의 Deployment는 새로운 버전이 배포될 때 기존 파드를 점진적으로 교체하는 Rolling Update 방식만 제공하는 반면, Argo Rollouts는 Canary, Blue-Green, Recreate 등 다양한 배포 전략을 지원합니다. 이를 통해 애플리케이션의 안정성을 높이고, 배포 과정에서 발생할 수 있는 문제를 최소화할 수 있습니다.
Argo Rollouts는 Argo CD와 함께 사용하여 GitOps 방식으로 배포를 관리할 수 있으며, Argo Workflows와 통합하여 CI/CD 파이프라인을 구축하는 데에도 유용합니다. 또한, Argo Rollouts는 Kubernetes의 Custom Resource Definition(CRD)을 사용하여 배포 리소스를 확장하고, 다양한 배포 전략을 지원합니다. 이번 문서에서는 간단하게 Argo Rollouts의 설치 방법과 Canary, Blue-Green 배포 전략을 사용하는 방법에 대해 알아보겠습니다.

 

Argo Rollouts은 왜 필요한가?

기본 Kubernetes의 Deployment는 Rolling Update 방식만 제공하기 때문에, 새로운 버전의 애플리케이션을 배포할 때 기존 파드를 점진적으로 교체하는 방식으로만 배포가 가능합니다. 이 경우, 새로운 버전의 애플리케이션이 문제가 발생할 경우 롤백이 어렵고, 배포 과정에서 발생할 수 있는 문제를 최소화하기 어렵습니다. Argo Rollouts는 이러한 문제를 해결하기 위해 다양한 배포 전략을 지원합니다.

  • 새 버전을 일부 트래픽만 먼저 받도록 배포하고 문제가 없는지 검증하는 Canary 배포
  • 기존 버전과 새 버전을 완전히 분리된 환경에서 배포한 뒤, 전환 시점을 제어하는 Blue-Green 배포
  • 실시간 모니터링과 메트릭 기반의 자동 판단, 수동 승인 또는 롤백
  • 배포 상태를 실시간으로 확인할 수 있는 CLI 또는 대시보드

 

Argo Rollouts은 어떻게 동작하는가?

Argo Rollouts는 Kubernetes의 Custom Resource Definition(CRD)을 사용하여 Deployment 리소스를 확장하고, 다양한 배포 전략을 지원합니다. 기본 Deployment 대신 Rollout 리소스를 정의하여, 컨테이너 이미지 버전 변경이나 레플리카 수 조정 등을 세밀하게 제어할 수 있습니다.

strategy:
  canary:
    steps:
    - setWeight: 20
    - pause: { duration: 1m }
    - setWeight: 50
    - pause: { duration: 2m }

이 설정은 새 버전을 20% 트래픽으로 먼저 배포한 후, 일정 시간이 지나고 50%로 늘려가며 점진적으로 전체로 확장하는 방식입니다.

 

Argo Rollouts 실습 전 요구 사항

  • Kubernetes 클러스터가 필요합니다. (버전 1.16 이상)
  • Helm이 설치되어 있어야 합니다. (버전 3.0 이상)

 

Argo Rollouts 설치하기

Argo Rollouts는 Helm Chart를 통해 설치할 수 있습니다. 아래의 명령어를 사용하여 Argo Rollouts를 설치합니다.

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

helm upgrade argo-rollouts argo/argo-rollouts \
    --install \
    --namespace cicd \
    --create-namespace \
    --version 2.39.5 \
    --set dashboard.enabled=true \
    --set dashboard.service.type=NodePort \
    --set dashboard.service.nodePort=31000

NodePort는 선택사항입니다.

 

Argo Rollouts CLI 설치하기

Argo Rollouts CLI는 Argo Rollouts의 배포 상태를 확인하고, 배포 전략을 관리하는 데 사용됩니다. 아래의 명령어를 사용하여 Argo Rollouts CLI를 설치합니다. 필자는 MacOS를 사용하고 있으므로, MacOS에 맞는 설치 방법을 안내합니다. 다른 OS를 사용하고 있다면 아래 공식 문서를 참고하여 설치하시기 바랍니다.

[공식 문서]https://argoproj.github.io/argo-rollouts/installation/

# MacOS 
brew install argoproj/tap/kubectl-argo-rollouts

# 확인
kubectl argo rollouts version

 


Argo Rollouts Canary 배포하기

Argo Rollouts를 사용하여 Canary 배포를 수행하는 방법은 다음과 같습니다. 아래의 명령어를 사용하여 Nginx를 이용한 Canary 배포 예제를 수행해 보겠습니다.

 

canary.yaml 파일 내용

apiVersion: argoproj.io/v1alpha1   # Argo Rollouts에서 사용하는 API 그룹과 버전
kind: Rollout                      # 리소스 종류: Rollout (Deployment와 유사하지만 Rollouts용)
metadata:
  name: canary-nginx               # Rollout 리소스 이름 (kubectl에서 이 이름으로 관리함)
spec:
  replicas: 10                     # 원하는 파드 개수
  selector:
    matchLabels:
      app: canary-nginx
  template:                        # 실제로 배포될 Pod 템플릿 (Deployment와 동일)
    metadata:
      labels:
        app: canary-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 80
  strategy:
    canary:                        # 배포 전략을 Canary 방식으로 설정
      steps:                       # 점진적 배포 단계를 정의
      - setWeight: 20              # 새 버전(nginx:1.16 → 변경 시)의 트래픽 비율을 20%로 설정
      - pause: { duration: 1m }    # 1분간 정지 (사용자가 검토 또는 자동 모니터링 가능)
      - setWeight: 50              # 그 다음 50% 트래픽을 새 버전으로 전환
      - pause: { duration: 1m }    # 다시 1분간 정지
      

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: canary-nginx
  name: canary-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: canary-nginx
  type: NodePort

필자는 테스트를 위해 Service의 타입을 NodePort로 설정하였습니다.

 

canary nginx 배포 및 테스트

# Rollout 생성
kubectl apply -f canary.yaml
# Rollout 상태 확인
kubectl argo rollouts get rollout canary-nginx

# image 업데이트
kubectl argo rollouts set image canary-nginx nginx=nginx:1.19.0
# Rollout 상태 확인
kubectl argo rollouts get rollout canary-nginx --watch

 

canary 결과

kubectl argo rollouts get rollout canary-nginx --watch

 

 

Argo Rollouts Blue-Green 배포하기

Argo Rollouts를 사용하여 Blue-Green 배포를 수행하는 방법은 다음과 같습니다. 아래의 명령어를 사용하여 Nginx를 Blue-Green 배포 예제를 수행해 보겠습니다.

 

blue-green.yaml 파일 내용

# bg-rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: bg-nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: bg-nginx
  template:
    metadata:
      labels:
        app: bg-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 80
  strategy:
    blueGreen:
      activeService: bg-nginx-active     # 실제 유저 트래픽용 서비스
      previewService: bg-nginx-preview   # 새 버전 미리보기용 서비스
      autoPromotionEnabled: false        # 수동으로 promote 해야만 버전 전환

---
apiVersion: v1
kind: Service
metadata:
  name: bg-nginx-active
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30081
  selector:
    app: bg-nginx
  type: NodePort

---
apiVersion: v1
kind: Service
metadata:
  name: bg-nginx-preview
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30082
  selector:
    app: bg-nginx
  type: NodePort

 

blue-green nginx 배포 및 테스트

# Rollout 생성
kubectl apply -f blue-green.yaml

# image 업데이트
kubectl argo rollouts set image bg-nginx nginx=nginx:1.19
# Rollout 상태 확인
kubectl argo rollouts get rollout bg-nginx --watch
# 새 버전으로 트래픽 전환
# autoPromotionEnabled=false로 설정했기 때문에 수동으로 트래픽을 전환해야 합니다.
kubectl argo rollouts promote bg-nginx

# 롤백 (문제 있을 경우)
kubectl argo rollouts undo bg-nginx

 

blue-green 트래픽 전환 전 모습

kubectl argo rollouts set image bg-nginx nginx=nginx:1.19

 

blue-green 트래픽 전환 후 모습

kubectl argo rollouts promote bg-nginx

 


Argo Rollouts Dashboard 확인

위와 같이 진행을 하였다면 NodePort 31000으로 대시보드 또한 배포되어 localhost:31000으로 rollouts의 결과를 확인할 수 있습니다.

 

+ Recent posts