이전에 무중단 배포방식중 하나인 Blue/Green에 대해서 이야기 한적이 있다.
기존의 Kubernetes에서도 Deployment 2개를 생성하고 Service의 Selector를 변경해주는 방법으로 Blue/Green 방식의 배포를 할 수 있다. 하지만 이러한 방법은 Deployment 2개를 운영해야 하기 때문에 번거롭기도 하고 ArgoCD를 사용하면 더 편리하게 Blue/Green 방식으로 배포할 수 있다.
기존 Kubernetes에서는 1개의 Pod가 각각 Rolling Update 방식으로 배포된다.
1. Blue (2) - Green (0)
2. Blue (1) - Green (1) <- 이 단계에서 이전 버전과 새로운 버전이 공존하는 현상이 나타남
3. Blue (0) - Green (2)
이러한 방식을 Blue/Green 방식으로 배포하게 되면,
1. Blue (2) - Green (0)
2. Blue (2) - Green (2) <- 이 단계에서 총 4개의 파드가 생성되면서 Green 으로 옮겨간다
3. Blue (0) - Green (2)
이번 글에서는 ArgoCD에 Blue/Green 방식으로 배포하는 방법에 대해서 알아보도록 하자.
Argo Rollouts 설치
https://argoproj.github.io/argo-rollouts/
Blue/Green 배포를 하려면 우선 argo rollouts에서 사용할 namespace를 생성하고,
argoCD에서 공식적으로 지원하는 Manifest 파일을 이용하여 argo rollouts을 설치한다.
# argo-rollouts의 namespace 생성
$ kubectl create namespace argo-rollouts
# manifest 파일 이용하여 argo-rollouts 설치
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
위에서 argo-rollouts을 설치하였으면 kubectl용 plugin 설치를 진행해준다.
# 다운로드
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
# 권한 변경
chmod +x ./kubectl-argo-rollouts-linux-amd64
# 파일 이동
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
# 설치 확인
root@node1:~ kubectl argo rollouts version
kubectl-argo-rollouts: v1.0.2+7a23fe5
BuildDate: 2021-06-15T19:36:00Z
GitCommit: 7a23fe5dbf78181248c48af8e5224246434e7f99
GitTreeState: clean
GoVersion: go1.16.3
Compiler: gc
Platform: linux/amd64
Blue/Green 배포하기
아래 예제를 사용하여 Blue/Green 배포할 Rollout과 Service를 생성합니다.
다음과 같이 Manifest 파일을 사용 할 repository에 push한다.
# ArgoCD Blue/Green 배포 예제
apiVersion: argoproj.io/v1alpha1 # apps/v1 대신 argoproj.io/v1alpha1을 사용한다
kind: Rollout # Deplyment 대신 Rollout을 사용한다
metadata:
name: rollout-bluegreen
spec:
replicas: 2
revisionHistoryLimit: 2
selector:
matchLabels:
app: rollout-bluegreen
template:
metadata:
labels:
app: rollout-bluegreen
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:blue
#image: argoproj/rollouts-demo:green
imagePullPolicy: Always
ports:
- containerPort: 8080
strategy:
blueGreen:
#activeService는 이전의 배포된 Blue 서비스
activeService: rollout-bluegreen-active
#previewService는 새롭게 배포될 Green 서비스
previewService: rollout-bluegreen-preview
#autoPromotioEnabled 옵션은 Blue/Green 배포를 자동으로 진행할 것인지 여부. false 옵션을 사용해 수동으로 지정
autoPromotionEnabled: false
---
kind: Service
apiVersion: v1
metadata:
name: rollout-bluegreen-active
spec:
selector:
app: rollout-bluegreen
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
kind: Service
apiVersion: v1
metadata:
name: rollout-bluegreen-preview
spec:
selector:
app: rollout-bluegreen
ports:
- protocol: TCP
port: 80
targetPort: 8080
예제로 보는 Rollout의 yaml파일을 보면 Deployment와 거의 흡사하다.
여기서 살펴봐야 할 부분은 strategy 옵션과 새로 생성한 2개의 서비스들이다.
Rollout은 2개의 서비스를 이용해 preview와 active로 나누어서 Blue와 Green을 구분하며,
active 에서는 blue가 보이고, preview에서는 green이 보이게 지정한다.
autoPromotionEnabled 옵션은 자동으로 배포할 것인지, 관리자가 수동으로 승인할 것인지에 대한 여부를 묻는 옵션이다.
Blue/Green을 배포할 예제 yaml 파일이 준비가 되었다면, 이제 Argo CD에서 배포를 해보자.
TEST라는 이름으로 yaml 파일이 저장된 레포지토리를 지정해서 새로운 애플리케이션을 배포해주자.
배포가 정상적으로 이루어지면 다음과 같은 화면이 표시된다.
Blue Green이 배포되었으니 확인하기 위해서 active와 preview 서비스의 노드포트를 통해서 접속해보자.
- active 접속 : <server ip>:30081
- preview 접속 : <server ip>:30082
[root@m-k8s ~]# kubectl get svc -n default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 47m
rollout-bluegreen-active NodePort 10.101.253.187 <none> 80:30081/TCP 93s
rollout-bluegreen-preview NodePort 10.98.175.235 <none> 80:30082/TCP 93s
배포를 진행하고 active 서비스로 접속을 해보면 Blue 페이지가 표시되는 것을 확인할 수 있다.
현재는 blue만 배포되어 있기 때문에 active와 preview 둘다 blue만 보일것이다.
다음으로 이전에 배포했던 yaml파일에서 주석처리 되어있던 Green 이미지를 사용하여 다시 재배포해주자.
spec:
containers:
- name: rollouts-demo
# green의 주석을 제거하고 blue에 주석을 달아줌
#image: argoproj/rollouts-demo:blue
image: argoproj/rollouts-demo:green
imagePullPolicy: Always
ports:
- containerPort: 8080
Green을 배포하고 preview 페이지로 접속해보면 green이 표시되는것을 확인할 수 있다.
그리고 실행되고 있는 pod를 확인해보면 총 4개의 pod가 생성되어 있고, 먼저 생성된 것이 blue, 나중에 새로 생겨난것이 green이다.
여기까지 진행하면 active에는 blue가 배포 되어있고, preview에 green이 배포되어 있는것을 직접 확인할 수 있다.
[root@m-k8s ~]# kubectl get po -n default
NAME READY STATUS RESTARTS AGE
rollout-bluegreen-6565b74f44-p24n7 1/1 Running 0 26m
rollout-bluegreen-6565b74f44-zjtps 1/1 Running 0 26m
rollout-bluegreen-86954dc7bf-rt8c4 1/1 Running 0 98s
rollout-bluegreen-86954dc7bf-zzx4d 1/1 Running 0 98s
Blue/Green 교체 승인
Blue/Green yaml 파일에서 autoPromotionEnabled 옵션을 false로 주었기 때문에 Blue에서 Green으로 자동으로 배포되지 않고 정지되어 있는 상태를 확인할 수 있다.
이후, 정상적으로 Blue/Green이 배포된것을 확인했다면 Green으로 교체해주는 과정을 진행해주어야 한다.
# rollouts 상태 확인 (Paused)
[root@m-k8s ~]# kubectl argo rollouts list rollout
NAME STRATEGY STATUS STEP SET-WEIGHT READY DESIRED UP-TO-DATE AVAILABLE
rollout-bluegreen BlueGreen Paused - - 2/4 2 2 2
promote 과정을 진행하면 rollouts의 상태가 healthy로 변하고 blue 배포되었던 pod가 종료된다.
이때 다시 active와 preview 로 접속해보면 모두 Green으로 표시되고 무사히 Blue에서 Green으로 교체되는 모습을 볼 수 있다.
# rollouts 상태 확인후 승인
[root@m-k8s ~]# kubectl argo rollouts promote rollout-bluegreen
rollout 'rollout-bluegreen' promoted
# rollouts 상태 확인 (Healthy)
[root@m-k8s ~]# kubectl argo rollouts list rollout
NAME STRATEGY STATUS STEP SET-WEIGHT READY DESIRED UP-TO-DATE AVAILABLE
rollout-bluegreen BlueGreen Healthy - - 2/4 2 2 2
# Blue Pod 종료중
[root@m-k8s ~]# kubectl get po -n default
NAME READY STATUS RESTARTS AGE
rollout-bluegreen-6565b74f44-p24n7 1/1 Terminating 0 35m
rollout-bluegreen-6565b74f44-zjtps 1/1 Terminating 0 35m
rollout-bluegreen-86954dc7bf-rt8c4 1/1 Running 0 10m
rollout-bluegreen-86954dc7bf-zzx4d 1/1 Running 0 10m
'DevOps > CI CD' 카테고리의 다른 글
[ArgoCD] Kubernetes Cluster에 ArgoCD 배포하기 (1) | 2021.07.02 |
---|---|
[무중단 배포] Rolling, Blue/Green, Canary 배포 (0) | 2021.06.16 |
[Jenkins] Jenkins에 Github를 연동하고 빌드 자동화하기 (2) | 2021.05.23 |
[Code Pipeline] EKS와 Code Pipeline를 사용하여 CI/CD 구축하기 (1) | 2021.05.07 |
[Jenkins] AWS EC2에 Jenkins를 설치해보자 (0) | 2021.04.13 |