새소식

기술/Application

Argo CD를 이용한 Canary 배포 (4)

  • -

안녕하세요. 이번 포스팅은 지난 Blue/Green 배포에 이어서 Canary 배포를 하는 방법에 대해서 가이드 하고자 합니다.

 

Canary 배포는 기존에 배포된 서비스에 신규 서비스를 한꺼번에 배포/교체를 진행하지 않고 소량의 Pod만 일시적으로 배포하는 방식입니다.

 

Canary 배포를 함으로서, 신규 서비스의 영향도나 반응 체크등을 할 수 있고 문제 시 소량 배포된 Pod만 정리하면 되기 때문에 편의성이 있습니다.

 

해당 배포 방식도 Kubernetes에서 Deployment만으로 배포가 가능하지만 Argo CD를 이용하는 방법에 대해 알아봅니다.

 

 

사전 준비 사항

* Argo CD 설치

* Argo Rollouts 설치

 

먼저 배포를 위해 아래의 코드를 사용하겠습니다.

 

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: canary-rollout
spec:
  replicas: 8
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: canary
  template:
    metadata:
      labels:
        app: canary
    spec:
      containers:
      - name: canary-rollouts-demo
        image: particule/simplecolorapi:1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 5000
  strategy:
    canary:
      maxSurge: "25%"
      maxUnavailable: 0
      steps:
      - setWeight: 25
      - pause: {}
---
kind: Service
apiVersion: v1
metadata:
  name: canary-service
spec:
  selector:
    app: canary
  ports:
  - protocol: TCP
    port: 80
    targetPort: 5000
    nodePort: 30081
  type: NodePort

 

눈여겨 봐야 하는 옵션은 역시 아래 부분입니다.

  strategy:
    canary:
      maxSurge: "25%"
      maxUnavailable: 0
      steps:
      - setWeight: 25
      - pause: {}

maxSurge는 배포되는 Pod의 비율을 뜻하고, maxUnavailable는 배포될 때 Unavailable되도 되는 Pod의 수를 뜻합니다.

 

steps에서 setWeight는 Weight 값을 주어 트래픽을 어느 정도 인가하는지에 대한 옵션입니다.

 

pause는 Blue/Green 때처럼 AutoPromotion Time을 뜻합니다.

 

아래와 같이 시간을 지정할 수 있습니다.

        - pause: { duration: 10 }  # 10초
        - pause: { duration: 10s } # 10초
        - pause: { duration: 10m } # 10분
        - pause: { duration: 10h } # 10시간
        - pause: { duration: -10 } # 잘못된 옵션
        - pause: {}                # Auto Promotion 옵션 비활성화

 

이제 배포를 진행해보겠습니다.

지난 배포 때와 옵션이 다르지 않기 때문에 설명하지 않겠습니다.

 

canary라는 namespace를 생성 후 배포합니다.

 

배포가 완료되었습니다. Canary page에 접속해보겠습니다.

Red라는 응답값이 나오게 됩니다.

 

이제 Blue라는 이미지를 배포하여, 25%의 배포 및 트래픽 인가를 해보겠습니다.

 

코드는 아래처럼 배포할 이미지 태그를 수정하면 됩니다.

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: canary-rollout
spec:
  replicas: 8
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: canary
  template:
    metadata:
      labels:
        app: canary
    spec:
      containers:
      - name: canary-rollouts-demo
        #태그 수정
        #particule/simplecolorapi:1.0 -> particule/simplecolorapi:2.0
        image: particule/simplecolorapi:2.0
        imagePullPolicy: Always
        ports:
        - containerPort: 5000
  strategy:
    canary:
      maxSurge: "25%"
      maxUnavailable: 0
      steps:
      - setWeight: 25
      - pause: {}

배포 후 신규 Replicaset이 생성되며 8개의 Pod의 25%니까 2개가 새로 배포된 것을 확인할 수 있습니다.

root@node1:~/.kube# while true; do curl http://192.168.217.4:30081 | jq .color; sleep 0.5; done
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    44  100    44    0     0  11000      0 --:--:-- --:--:-- --:--:-- 11000
"red"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    44  100    44    0     0  14666      0 --:--:-- --:--:-- --:--:-- 14666
"red"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   6428      0 --:--:-- --:--:-- --:--:--  6428
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   5625      0 --:--:-- --:--:-- --:--:--  5625
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    44  100    44    0     0  11000      0 --:--:-- --:--:-- --:--:-- 14666
"red"

0.5초마다 curl을 실행하여 테스트할 때, 정상적으로 Canary 배포가 되어 있는 점을 확인할 수 있습니다.

 

배포가 정상적으로 이루어졌고, canary 버전이 문제가 없기 때문에 기존에 배포된 내용을 걷어내고, canary 버전을 완전히 배포해보겠습니다.

 

Blue/Green 때와 같이 CLI 환경으로 갑니다.

root@node1:~/.kube# kubectl argo rollouts list rollout -n canary
NAME            STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE
canary-rollout  Canary     Paused        1/2   25          8/8    8        2           8

Blue/Green 때처럼 Status가 Pause 상태인 것을 확인할 수 있습니다.

 

Promote명령어를 이용하여 배포를 진행합니다.

root@node1:~/.kube# kubectl argo rollouts promote -n canary canary-rollout
rollout 'canary-rollout' promoted

root@node1:~/.kube# kubectl argo rollouts list rollout -n canary
NAME            STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE
canary-rollout  Canary     Healthy       2/2   100         8/8    8        8           8

배포가 완료되고 Status가 Healthy로 변경된 것을 확인할 수 있습니다.

 

root@node1:~/.kube# while true; do curl http://192.168.217.4:30081 | jq .color; sleep 0.5; done
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   9000      0 --:--:-- --:--:-- --:--:--  9000
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   6428      0 --:--:-- --:--:-- --:--:--  7500
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   2500      0 --:--:-- --:--:-- --:--:--  2500
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   6428      0 --:--:-- --:--:-- --:--:--  6428
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   5000      0 --:--:-- --:--:-- --:--:--  5000
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   3214      0 --:--:-- --:--:-- --:--:--  3214
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0  15000      0 --:--:-- --:--:-- --:--:-- 15000
"blue"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0   5625      0 --:--:-- --:--:-- --:--:--  5625
"blue"

curl 확인했을 때 완전히 배포가 끝나서 기존 Red 쪽 Pod들은 모두 정리되고 Blue 쪽으로만 트래픽이 인가되는 것을 확인할 수 있습니다.

 

이상으로 Canary 배포에 대해 알아보았습니다.

 

긴 글 읽어주셔서 감사합니다!

 

해당 가이드 글에서 사용한 소스 코드는 아래에 공개하고 있습니다. :)

 

https://github.com/teichae/gitops

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.