ArgoCD Rollout Blue/Green 배포 설정을 합니다.
우선 helm help 로 helm 이 설치 되어있는지 확인 합니다.
설치가 안되어있다면 아래 명령어로 Helm 을 설치 합니다.
snap install helm --classic
아래와 같이 argo-rollouts 네이스페이스를 생성하고 설치 합니다.
helm repo add stable https://charts.helm.sh/stable
helm repo update
# argo-rollouts 네임스페이스 생성
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml # argo-rollouts 생성
#다운로드
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
#설치 완료 후
kubectl argo rollouts version
설치가 완료 되었다면 이제 기존 jenkins pipeline 의 pipeline script 에서 Push Yaml 스테이지의 deployment.yaml 부분을 아래과 같이 수정 합니다.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
labels:
app: review
name: review-rollout
namespace: default
spec:
selector:
matchLabels:
app: review
replicas: 2
revisionHistoryLimit: 2
template:
metadata:
labels:
app: review
spec:
containers:
- image: ${NCR_TASK_URL}/review:ver${env.BUILD_NUMBER}
name: review
ports:
- containerPort: 7000
imagePullSecrets:
- name: regcred
strategy:
blueGreen:
activeService: review-svc-active
previewService: review-svc-preview
autoPromotionEnabled: false
---
apiVersion: v1
kind: Service
metadata:
name: review-svc-active
namespace: default
spec:
ports:
- port: 7000
name: http
protocol: TCP
targetPort: 7000
type: NodePort
selector:
app: review
---
apiVersion: v1
kind: Service
metadata:
name: review-svc-preview
namespace: default
spec:
ports:
- port: 7000
name: http
protocol: TCP
targetPort: 7000
type: NodePort
selector:
app: review
Blue/Green 배포를 하기 위해 기존 deployment.yaml 파일을 위와 같이 수정 하였습니다
위 내용에서 눈여겨볼 부분은 아래와 같습니다.
autoPromotionEnabled: false
이 값이 false 이면 자동이 아닌 수동으로 rollout 승인을 해줘야 배포가 됩니다.
기존 review 의 deployment 와 svc, ingress 를 지우고 위 jenkins pipeline 을
실행 합니다.
두번 실행 하고 나서 아래 명령어로 확인해 보면 총 4개의 pod 가 생성 되고 그중 2개가 READY 상태이며 STATUS 는 Paused 입니다.
kubectl argo rollouts list rollout -n default
아래와 같이 argocd 콘솔에서도 확인 할 수 있습니다.
이제 아래와 같이 Promote 승인 합니다.
kubectl argo rollouts promote -n default review-rollout
또는 argocd 콘솔에서 아래와 같이 Promote-full 승인 합니다.
그리고 아래와 같이 변화를 확인 합니다.
review-svc-active 서비스에 로드밸런서 ALB 를 연결하여 확인 하겠습니다.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: review-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
alb.ingress.kubernetes.io/description: 'alb ingress controller'
labels:
app: review-ingress
spec:
backend:
serviceName: review-svc-active
servicePort: 7000
rules:
- http:
paths:
- path: /*
backend:
serviceName: review-svc-active
servicePort: 7000
위와 같이 mysample-rollout-ingress.yaml 파일을 생성 후 kubectl apply -f mysample-rollout-ingress.yaml 을 실행하여 로드밸런서를 생성 하였습니다.
preview Service 테스트는 아래와 같이 port-forward 로 확인 합니다.
kubectl port-forward --address 0.0.0.0 pod/[pod name] 7000:7000 -n default
이상 Blue/Green 배포까지 완료 하였습니다.
오늘도 셋팅 하시느라 고생 많으셨습니다.