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 배포에 대해 알아보았습니다.
긴 글 읽어주셔서 감사합니다!
해당 가이드 글에서 사용한 소스 코드는 아래에 공개하고 있습니다. :)
'기술 > Application' 카테고리의 다른 글
Terraform Kubernetes Provider 설정하기 (1) (0) | 2020.11.12 |
---|---|
Packer와 Ansible을 이용한 Docker Image 생성 및 배포 (4) | 2020.11.10 |
Argo CD를 이용한 Blue/Green 배포 (3) (7) | 2020.10.22 |
[Kubernetes Monitoring] Grafana에서 Panel 추가하기 (0) | 2020.10.16 |
[Kubernetes Monitoring] Grafana에 Prometheus Data Source 추가하기 (0) | 2020.10.15 |
소중한 공감 감사합니다