PaaS/CI CD

Argo Rollout으로 Blue/Green 배포하기

armyost 2023. 11. 15. 13:45
728x90

ArgoCD 서버 설치부터 Argo Rollout 을 통한 Blue/Green 배포까지 설명한다.

 

Argo Rollout   Blue / Green 이벤트 순서 (https://argo-rollouts.readthedocs.io/en/stable/features/bluegreen/)

1. 완전히 사용자에게 런칭되기전 Revision 1은 ActiveService와 PreviewService으로 지명됩니다.
2. 서비스 배포자는 Rollout YAML의 spec.template.spec를 Revision 2의 Image로 변경합니다.
3. 해당 Revision 2 ReplicaSet이 0 Size로 만들어 집니다.
4. PreviewService는 이 Revision 2 ReplicaSet을 가리킵니다. (이때 여전히 ActiveService는 Revision 1을 가리킵니다.)
5. 이 Revision 2는 이제 ReplicaSet Size를 spec.relicas 혹은 previewReplicaCount에 맞추어 늘립니다.
6. 이 Revision 2 ReplicaSet이 완전히 배포되어 정상으로 작동하면 prePromotionAnalysis가 작동합니다.
7. 이 prePromotionAnalysis는 런칭 이전 사전 점검이며 이걸 통과해야 후속 프로세스가 진행됩니다.
7-1. autoPromotionEnabled가 false라면 일단 정지합니다. 사람이 확인후에 manual하게 다시 rollout명령을 해주면 됩니다.
8. ActiveService를 업데이트 하면서 Rollout은 Revision 2 ReplicaSet을 가리킵니다. 이제 Revision1을 가리키는 서비스는 없습니다.
9. postPromotionAnalysis가 작동합니다.
10. postPromotionAnalysis가 성공하면 Revision 2 ReplicaSet은 Stable 버전으로 자리잡게 됩니다.
11. scaleDownDelaySeconds(default 30초) 이후에 기존의 Revision 1 ReplicaSet은 Scale Down됩니다.

 

우선 ArgoCD Server를 설치하자

# argoCD Server용 NameSpace 만들기
$ kubectl create namespace argocd

# argoCD 설치하기
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# argoCD 설치확인
$ kubectl get service -n argocd 

# argoCD 서비스 접속을 위한 Admin Token 확인
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

 

※ 추가 : argoCD 서비스 노출을 ingress로 하기

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: "nginx"
  rules:
  - host: argocd.armyost.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 443

이제 Argo Rollout을 배포하자

# Argo Rollout 리소스 전용 NameSpace 만들기
$ kubectl create namespace argo-rollouts

# Argo Rollout 모듈 설치
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

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

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

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

# Argo Rollout Plugin 설치 확인 
$ kubectl argo rollouts version

 


Argo Rollout으로 서비스를 배포해보자. 다만 이때 Argo CD 콘솔에서 배포 해보자.

 

Argo CD에서 아래 Github URL을 활용하여 등록한다.

https://github.com/armyost/ArgoRollout

 

GitHub - armyost/ArgoRollout

Contribute to armyost/ArgoRollout development by creating an account on GitHub.

github.com

 

 

여기까지 배포하면 배포된 Sample Application이 보인다. 참고로 이 버전은 blue 버전이다.

 

이제 green 버전을 배포해보자. 'rollout-bluegreen' 의 YAML에서 blue를 green으로 바꾸어 다시 Argo CD에서 'Sync' 를 돌리자. 

# ASIS
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

# TOBE
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:green

 

그러면 아래와 같이 blue 버전이 ContainerCreating이 발생한다. 

 

 

이때 active 서비스와 preview 서비스를 보면 다음과 같다. Active는 여전히 blue 버전이고 Preview는 Green 버전이다.

 

Green 배포가 Running으로 되더라도 Active가 blue로 유지되는것은 여전하다.

 

이는 관리자가 Promote를 할때까지 Pause 되어 대기하는 현상이다.

 

 

Green 버전이 사용자에게 런칭해도 무방한지 충분히 검토가 되었다면 Promote하여 런칭한다. 

 

$ kubectl argo rollouts promote rollout-bluegreen -n argo-sample-app

 

 

이제 Active 서비스도 Green 버전이다.