Container/Devops

[Devops] Argo Rollouts를 이용한 Blue/Green 배포

pepe_ 2024. 3. 15. 22:05

1. Argo Rollouts 소개

1) Argo Rollouts 이란?

  • Argo rollouts은 Progressive Delivery를 지원하는 툴이다. 
  • 쿠버네티스에서 롤아웃 관리를 위한 오픈소스 도구 중 하나로, Kubernetes에서 Blue/Green, Canary 등 배포를 지원한다.

2) Argo Rollouts을 사용하는 이유

  • Kubernetes의 기본 배포 전략은 RollingUpdate이나, RollingUpdate는 여러 가지 제약 사항이 있다. 이를 해결하기 위해 Blue/Green 또는 Canary 배포 방식을 사용한다. 
  • 하지만, Blue/Green 또는 Canary 배포 방식을 직접 구성하려면 Deployment를 2개 운영하고, Service에서 Selector를 변경해야 함으로 번거롭다. 이때, Argo Rollouts을 활용하여 자동으로 쉽게 구현할 수 있다. 

3)  Argo Rollouts 동작 방식

  •  Argo Rollouts controller는 deployment와 유사하게 동작한다.
  • Argo Rollouts controller는 ReplicaSet의 생성, 확장, 및 삭제를 관리한다.
  • ReplicaSet은 Rollout 리소스 내의 spec.template 필드에 의해 정의되며, deployment와 동일한 템플릿을 사용한다.
    • spec.template이 변경되면, Argo Rollouts controller에게 새로운 ReplicaSet이 도입될 것이라고 신호를 보낸다.
    • Argo Rollouts controller는 spec.strategy 필드 내에서 설정된 전략(Blue/Green, Canary)을 사용하여 이전 ReplicaSet에서 새로운 ReplicaSet으로 롤아웃이 진행될 방법을 결정한다.
    • 새로운 ReplicaSet이 확장되고, Argo Rollouts controller에서 "stable" 상태로 표시된다.

2. Argo Rollout 설치

1) Controller 설치

# Argo Rollouts에서 사용할 Namespace 생성
kubectl create namespace argo-rollouts
# 공식적으로 지원하는 manifest인 install.yaml을 사용하여 설치 진행
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

2) Argo Rollouts Kubectl plugin 설치

# Argo Rollouts Kubectl 플러그인 설치
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
# kubectl-argo-rollouts 바이너리 권한 변경
chmod +x ./kubectl-argo-rollouts-linux-amd64
# kubectl-argo-rollouts 바이너리 파일 PATH로 이동
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
# 설치 테스트
kubectl argo rollouts version

3. Blue/Green 배포 테스트

1) Blue/Green Manifest 배포

  • spec.strategy를 blueGreen으로 지정한다.
    • activeService: rollout-bluegreen-active → 현재 운영 중인 서비스
    • previewService: rollout-bluegreen-preview → 새 버전의 배포에 연결되는 서비스
    • autoPromotionEnabled: false → 자동으로 Blue/Green 변경되지 않고 사용자 승인 후 교체 진행
  • active용 Service와, preview용 Service 를 생성한다.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-bluegreen
spec:
  replicas: 3
  selector:
    matchLabels:
      app: rollout-bluegreen
  template:
    metadata:
      labels:
        app: rollout-bluegreen
    spec:
      containers:
      # 추후 image: argoproj/rollouts-demo:blue -> image: argoproj/rollouts-demo:green 으로 수정
      - image: argoproj/rollouts-demo:blue 
        name: rollouts-demo
  strategy:
    blueGreen:
      activeService: rollout-bluegreen-active
      previewService: rollout-bluegreen-preview
      autoPromotionEnabled: false
 
---
apiVersion: v1
kind: Service
metadata:
  name: rollout-bluegreen-active
spec:
  selector:
    app: rollout-bluegreen
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: rollout-bluegreen-preview
spec:
  selector:
    app: rollout-bluegreen
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  • 배포 후 active와 preview가 똑같은 Blue 버전이다.
boc@vm-bastion-hub:~/test$ k get svc -n my-ns 
NAME                                TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
service/rollout-bluegreen-active    LoadBalancer   192.168.0.199   20.249.192.1    80:30664/TCP   15m
service/rollout-bluegreen-preview   LoadBalancer   192.168.0.112   20.249.192.39   80:31609/TCP   15m

2) Manifest 수정

  • 하기와 같이 Manifest를 수정하여 Green 버전을 배포한다. 
k edit rollouts.argoproj.io -n my-ns rollout-bluegreen
# image: argoproj/rollouts-demo:blue -> image: argoproj/rollouts-demo:green 변경
  • 새로운 버전의 replicaset이 배포되면 preview 서비스는 기존의 replicaset(Blue버전)에서 새로운 replicaset(Green버전)으로 트래픽이 변경된다. 이에, preview 서비스 IP로 접속했을 때 Green 버전으로 변경된 것을 확인할 수 있다.
  • autoPromotionEnabled 옵션이 false로 설정되어 있어 Blue에서 Green으로 자동으로 배포되지 않고 Pause 상태로 멈춰 있는 것을 확인할 수 있다.
boc@vm-bastion-hub:~/test$ k argo rollouts list rollout -n my-ns
NAME               STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE
rollout-bluegreen  BlueGreen  Paused        -     -           3/6    3        3           3

3) promote 진행

  • Green 버전이 정상적으로 배포된 것을 확인한 후 promote를 진행한다.
  • promote과정을 통해 Blue 버전으로 배포되어있던 pod들이 모두 삭제되고 Rollouts의 상태가 healthy로 변한다.
  • active와 preview 접속 시 모두 Green으로 바뀐것을 확인할 수 있다.
# promote 진행
boc@vm-bastion-hub:~/test$ kubectl argo rollouts promote rollout-bluegreen -n my-ns
rollout 'rollout-bluegreen' promoted

# argo rollouts list 확인
boc@vm-bastion-hub:~/test$ kubectl argo rollouts list rollout -n my-ns
NAME               STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE
rollout-bluegreen  BlueGreen  Healthy       -     -           3/3    3        3           3

# pod 확인
boc@vm-bastion-hub:~/test$ kubectl get pods -n my-ns 
NAME                                 READY   STATUS    RESTARTS   AGE
rollout-bluegreen-84d95ffc99-flqkt   1/1     Running   0          42m
rollout-bluegreen-84d95ffc99-pw7m9   1/1     Running   0          42m
rollout-bluegreen-84d95ffc99-z77lw   1/1     Running   0          42m