Among Us - Yellow Crewmate [ArgoCD] ArgoCD에서 Blue/Green 배포하기

DevOps/CI CD

[ArgoCD] ArgoCD에서 Blue/Green 배포하기

감쟈! 2021. 7. 5. 18:44

 

이전에 무중단 배포방식중 하나인 Blue/Green에 대해서 이야기 한적이 있다. 

 

기존의 Kubernetes에서도 Deployment 2개를 생성하고 Service의 Selector를 변경해주는 방법으로 Blue/Green 방식의 배포를 할 수 있다. 하지만 이러한 방법은 Deployment 2개를 운영해야 하기 때문에 번거롭기도 하고 ArgoCD를 사용하면 더 편리하게 Blue/Green 방식으로 배포할 수 있다.

 

기존 Kubernetes에서는 1개의 Pod가 각각 Rolling Update 방식으로 배포된다.

1. Blue (2) - Green (0)

2. Blue (1) - Green (1) <- 이 단계에서 이전 버전과 새로운 버전이 공존하는 현상이 나타남

3. Blue (0) - Green (2)

 

이러한 방식을 Blue/Green 방식으로 배포하게 되면,

1. Blue (2) - Green (0)

2. Blue (2) - Green (2) <- 이 단계에서 총 4개의 파드가 생성되면서 Green 으로 옮겨간다

3. Blue (0) - Green (2)

 

 

이번 글에서는 ArgoCD에 Blue/Green 방식으로 배포하는 방법에 대해서 알아보도록 하자.


Argo Rollouts 설치

 

https://argoproj.github.io/argo-rollouts/

 

Argo Rollouts - Kubernetes Progressive Delivery Controller

Argo Rollouts - Kubernetes Progressive Delivery Controller What is Argo Rollouts? Argo Rollouts is a Kubernetes controller and set of CRDs which provide advanced deployment capabilities such as blue-green, canary, canary analysis, experimentation, and prog

argoproj.github.io

 

Blue/Green 배포를 하려면 우선 argo rollouts에서 사용할 namespace를 생성하고,

argoCD에서 공식적으로 지원하는 Manifest 파일을 이용하여 argo rollouts을 설치한다.

# argo-rollouts의 namespace 생성
$ kubectl create namespace argo-rollouts

# manifest 파일 이용하여 argo-rollouts 설치
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

 

 

위에서 argo-rollouts을 설치하였으면 kubectl용 plugin 설치를 진행해준다.

# 다운로드
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64

# 권한 변경
chmod +x ./kubectl-argo-rollouts-linux-amd64

# 파일 이동
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

# 설치 확인 
root@node1:~ kubectl argo rollouts version
kubectl-argo-rollouts: v1.0.2+7a23fe5
  BuildDate: 2021-06-15T19:36:00Z
  GitCommit: 7a23fe5dbf78181248c48af8e5224246434e7f99
  GitTreeState: clean
  GoVersion: go1.16.3
  Compiler: gc
  Platform: linux/amd64

 

Blue/Green 배포하기

아래 예제를 사용하여 Blue/Green 배포할 Rollout과 Service를 생성합니다.

다음과 같이 Manifest 파일을 사용 할 repository에 push한다.

# ArgoCD Blue/Green 배포 예제

apiVersion: argoproj.io/v1alpha1     # apps/v1 대신 argoproj.io/v1alpha1을 사용한다
kind: Rollout  # Deplyment 대신 Rollout을 사용한다
metadata:
  name: rollout-bluegreen
spec:
  replicas: 2
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: rollout-bluegreen
  template:
    metadata:
      labels:
        app: rollout-bluegreen
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
       #image: argoproj/rollouts-demo:green
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
  strategy:
    blueGreen: 
      #activeService는 이전의 배포된 Blue 서비스
      activeService: rollout-bluegreen-active
      
      #previewService는 새롭게 배포될 Green 서비스
      previewService: rollout-bluegreen-preview
      
      #autoPromotioEnabled 옵션은 Blue/Green 배포를 자동으로 진행할 것인지 여부. false 옵션을 사용해 수동으로 지정
      autoPromotionEnabled: false

---
kind: Service
apiVersion: v1
metadata:
  name: rollout-bluegreen-active
spec:
  selector:
    app: rollout-bluegreen
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

---
kind: Service
apiVersion: v1
metadata:
  name: rollout-bluegreen-preview
spec:
  selector:
    app: rollout-bluegreen
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

예제로 보는 Rollout의 yaml파일을 보면 Deployment와 거의 흡사하다.

여기서 살펴봐야 할 부분은 strategy 옵션과 새로 생성한 2개의 서비스들이다.

 

Rollout은 2개의 서비스를 이용해 preview와 active로 나누어서 Blue와 Green을 구분하며,

active 에서는 blue가 보이고, preview에서는 green이 보이게 지정한다.

 

autoPromotionEnabled 옵션은 자동으로 배포할 것인지, 관리자가 수동으로 승인할 것인지에 대한 여부를 묻는 옵션이다.

 

 

 

Blue/Green을 배포할 예제 yaml 파일이 준비가 되었다면, 이제 Argo CD에서 배포를 해보자.

TEST라는 이름으로 yaml 파일이 저장된 레포지토리를 지정해서 새로운 애플리케이션을 배포해주자. 

 

 

 

배포가 정상적으로 이루어지면 다음과 같은 화면이 표시된다.

 

Blue Green이 배포되었으니 확인하기 위해서 active와 preview 서비스의 노드포트를 통해서 접속해보자.

 

  • active 접속 : <server ip>:30081
  • preview 접속 : <server ip>:30082
[root@m-k8s ~]# kubectl get svc -n default
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        47m
rollout-bluegreen-active    NodePort    10.101.253.187   <none>        80:30081/TCP   93s       
rollout-bluegreen-preview   NodePort    10.98.175.235    <none>        80:30082/TCP   93s

 

 

배포를 진행하고 active 서비스로 접속을 해보면 Blue 페이지가 표시되는 것을 확인할 수 있다.

현재는 blue만 배포되어 있기 때문에 active와 preview 둘다 blue만 보일것이다.

 

다음으로 이전에 배포했던 yaml파일에서 주석처리 되어있던 Green 이미지를 사용하여 다시 재배포해주자.

    spec:
      containers:
      - name: rollouts-demo
       # green의 주석을 제거하고 blue에 주석을 달아줌 
       #image: argoproj/rollouts-demo:blue
        image: argoproj/rollouts-demo:green
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

 

Green을 배포하고 preview 페이지로 접속해보면 green이 표시되는것을 확인할 수 있다.

 

그리고 실행되고 있는 pod를 확인해보면 총 4개의 pod가 생성되어 있고, 먼저 생성된 것이 blue, 나중에 새로 생겨난것이 green이다.

여기까지 진행하면 active에는 blue가 배포 되어있고, preview에 green이 배포되어 있는것을 직접 확인할 수 있다.

[root@m-k8s ~]# kubectl get po -n default
NAME                                 READY   STATUS    RESTARTS   AGE
rollout-bluegreen-6565b74f44-p24n7   1/1     Running   0          26m
rollout-bluegreen-6565b74f44-zjtps   1/1     Running   0          26m
rollout-bluegreen-86954dc7bf-rt8c4   1/1     Running   0          98s
rollout-bluegreen-86954dc7bf-zzx4d   1/1     Running   0          98s

Blue/Green 교체 승인

 

Blue/Green yaml 파일에서 autoPromotionEnabled 옵션을 false로 주었기 때문에 Blue에서 Green으로 자동으로 배포되지 않고 정지되어 있는 상태를 확인할 수 있다.

 

이후, 정상적으로 Blue/Green이 배포된것을 확인했다면 Green으로 교체해주는 과정을 진행해주어야 한다.

 

 

# rollouts 상태 확인 (Paused)
[root@m-k8s ~]# kubectl argo rollouts list rollout
NAME               STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE    
rollout-bluegreen  BlueGreen  Paused        -     -           2/4    2        2           2

 

promote 과정을 진행하면 rollouts의 상태가 healthy로 변하고 blue 배포되었던 pod가 종료된다.

 

이때 다시 active와 preview 로 접속해보면 모두 Green으로 표시되고 무사히 Blue에서 Green으로 교체되는 모습을 볼 수 있다.

# rollouts 상태 확인후 승인
[root@m-k8s ~]# kubectl argo rollouts promote rollout-bluegreen
rollout 'rollout-bluegreen' promoted

# rollouts 상태 확인 (Healthy)
[root@m-k8s ~]# kubectl argo rollouts list rollout
NAME               STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE    
rollout-bluegreen  BlueGreen  Healthy       -     -           2/4    2        2           2

# Blue Pod 종료중
[root@m-k8s ~]# kubectl get po -n default
NAME                                 READY   STATUS        RESTARTS   AGE
rollout-bluegreen-6565b74f44-p24n7   1/1     Terminating   0          35m
rollout-bluegreen-6565b74f44-zjtps   1/1     Terminating   0          35m
rollout-bluegreen-86954dc7bf-rt8c4   1/1     Running       0          10m
rollout-bluegreen-86954dc7bf-zzx4d   1/1     Running       0          10m