새소식

기술/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

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

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