1. Argo Rollouts 소개
1) Argo Rollouts 이란?
- Argo rollouts은 Progressive Delivery를 지원하는 툴이다.
- 쿠버네티스에서 롤아웃 관리를 위한 오픈소스 도구 중 하나로, Kubernetes에서 Blue/Green, Canary 등 배포를 지원한다.
2) Argo Rollouts을 사용하는 이유
- Kubernetes의 기본 배포 전략은 RollingUpdate이나, RollingUpdate는 여러 가지 제약 사항이 있다. 이를 해결하기 위해 Blue/Green 또는 Canary 배포 방식을 사용한다.
- 하지만, Blue/Green 또는 Canary 배포 방식을 직접 구성하려면 Deployment를 2개 운영하고, Service에서 Selector를 변경해야 함으로 번거롭다. 이때, Argo Rollouts을 활용하여 자동으로 쉽게 구현할 수 있다.
3) Argo Rollouts 동작 방식
- Argo Rollouts controller는 deployment와 유사하게 동작한다.
- Argo Rollouts controller는 ReplicaSet의 생성, 확장, 및 삭제를 관리한다.
- ReplicaSet은 Rollout 리소스 내의 spec.template 필드에 의해 정의되며, deployment와 동일한 템플릿을 사용한다.
- spec.template이 변경되면, Argo Rollouts controller에게 새로운 ReplicaSet이 도입될 것이라고 신호를 보낸다.
- Argo Rollouts controller는 spec.strategy 필드 내에서 설정된 전략(Blue/Green, Canary)을 사용하여 이전 ReplicaSet에서 새로운 ReplicaSet으로 롤아웃이 진행될 방법을 결정한다.
- 새로운 ReplicaSet이 확장되고, Argo Rollouts controller에서 "stable" 상태로 표시된다.
2. Argo Rollout 설치
1) Controller 설치
- Controller 설치 사이트
- 설치 시 service account, clusterrole, configmap, secret, svc, pod 등이 생성된다.
# Argo Rollouts에서 사용할 Namespace 생성
kubectl create namespace argo-rollouts
# 공식적으로 지원하는 manifest인 install.yaml을 사용하여 설치 진행
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
2) Argo Rollouts Kubectl plugin 설치
- Argo Rollouts Kubectl plugin 설치 사이트
- Argo Rollouts Kubectl plugin 은 선택 사항이나 명령 줄에서 롤아웃을 관리하고 시각화하는 데 편리하다.
# Argo Rollouts Kubectl 플러그인 설치
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
# kubectl-argo-rollouts 바이너리 권한 변경
chmod +x ./kubectl-argo-rollouts-linux-amd64
# kubectl-argo-rollouts 바이너리 파일 PATH로 이동
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
# 설치 테스트
kubectl argo rollouts version
3. Blue/Green 배포 테스트
1) Blue/Green Manifest 배포
- spec.strategy를 blueGreen으로 지정한다.
- activeService: rollout-bluegreen-active → 현재 운영 중인 서비스
- previewService: rollout-bluegreen-preview → 새 버전의 배포에 연결되는 서비스
- autoPromotionEnabled: false → 자동으로 Blue/Green 변경되지 않고 사용자 승인 후 교체 진행
- active용 Service와, preview용 Service 를 생성한다.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-bluegreen
spec:
replicas: 3
selector:
matchLabels:
app: rollout-bluegreen
template:
metadata:
labels:
app: rollout-bluegreen
spec:
containers:
# 추후 image: argoproj/rollouts-demo:blue -> image: argoproj/rollouts-demo:green 으로 수정
- image: argoproj/rollouts-demo:blue
name: rollouts-demo
strategy:
blueGreen:
activeService: rollout-bluegreen-active
previewService: rollout-bluegreen-preview
autoPromotionEnabled: false
---
apiVersion: v1
kind: Service
metadata:
name: rollout-bluegreen-active
spec:
selector:
app: rollout-bluegreen
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: rollout-bluegreen-preview
spec:
selector:
app: rollout-bluegreen
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
- 배포 후 active와 preview가 똑같은 Blue 버전이다.
boc@vm-bastion-hub:~/test$ k get svc -n my-ns
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/rollout-bluegreen-active LoadBalancer 192.168.0.199 20.249.192.1 80:30664/TCP 15m
service/rollout-bluegreen-preview LoadBalancer 192.168.0.112 20.249.192.39 80:31609/TCP 15m
2) Manifest 수정
- 하기와 같이 Manifest를 수정하여 Green 버전을 배포한다.
k edit rollouts.argoproj.io -n my-ns rollout-bluegreen
# image: argoproj/rollouts-demo:blue -> image: argoproj/rollouts-demo:green 변경
- 새로운 버전의 replicaset이 배포되면 preview 서비스는 기존의 replicaset(Blue버전)에서 새로운 replicaset(Green버전)으로 트래픽이 변경된다. 이에, preview 서비스 IP로 접속했을 때 Green 버전으로 변경된 것을 확인할 수 있다.
- autoPromotionEnabled 옵션이 false로 설정되어 있어 Blue에서 Green으로 자동으로 배포되지 않고 Pause 상태로 멈춰 있는 것을 확인할 수 있다.
boc@vm-bastion-hub:~/test$ k argo rollouts list rollout -n my-ns
NAME STRATEGY STATUS STEP SET-WEIGHT READY DESIRED UP-TO-DATE AVAILABLE
rollout-bluegreen BlueGreen Paused - - 3/6 3 3 3
3) promote 진행
- Green 버전이 정상적으로 배포된 것을 확인한 후 promote를 진행한다.
- promote과정을 통해 Blue 버전으로 배포되어있던 pod들이 모두 삭제되고 Rollouts의 상태가 healthy로 변한다.
- active와 preview 접속 시 모두 Green으로 바뀐것을 확인할 수 있다.
# promote 진행
boc@vm-bastion-hub:~/test$ kubectl argo rollouts promote rollout-bluegreen -n my-ns
rollout 'rollout-bluegreen' promoted
# argo rollouts list 확인
boc@vm-bastion-hub:~/test$ kubectl argo rollouts list rollout -n my-ns
NAME STRATEGY STATUS STEP SET-WEIGHT READY DESIRED UP-TO-DATE AVAILABLE
rollout-bluegreen BlueGreen Healthy - - 3/3 3 3 3
# pod 확인
boc@vm-bastion-hub:~/test$ kubectl get pods -n my-ns
NAME READY STATUS RESTARTS AGE
rollout-bluegreen-84d95ffc99-flqkt 1/1 Running 0 42m
rollout-bluegreen-84d95ffc99-pw7m9 1/1 Running 0 42m
rollout-bluegreen-84d95ffc99-z77lw 1/1 Running 0 42m
'Container > Devops' 카테고리의 다른 글
[Devops] Argo Rollouts를 이용한 Canary 배포 (0) | 2024.03.18 |
---|---|
[Devops] CI/CD 배포 전략 - Rolling, Blue/Green, Canary (0) | 2024.03.08 |
[Devops] Jenkins, ArgoCD를 통한 CI/CD 구성 - (2) ArgoCD 구성 (1) | 2024.03.07 |
[Devops] Jenkins, ArgoCD를 통한 CI/CD 구성 - (1) Jenkins 구성 (1) | 2024.03.07 |
[Devops] Jenkins에서 Plugin 및 Credential 설정 (0) | 2024.03.04 |