이전 포스트 까지 GitHub - ArgoCD 서비스를 연동하여 자동으로 배포되는 환경을 구축 했으며
기존 환경에서 ArgoRollout을 이용하면 블루그린 배포 및 canary 구성이 가능하다.
이번 포스트는 ArgoRollout을 통해 canary 배포를 진행한다.
Argo Rollout EKS 클러스터 내 pod,서비스로 구성되며 Kustomize를 기반으로 구성할 예정이다.
로컬 PC에서 Argo CD를 설치하기 위한 디렉터리 구조 및 스크립트는 아래와 같이 구성 했다.
resources:
- https://github.com/<github 유저명>/management-repository//argo-rollout?ref=main
#! /bin/bash
# Namespace 생성
kubectl create namespace argo-rollouts
# Argo Rollout 설치
kubectl kustomize ../manifests/ | kubectl apply -f -
# 리눅스에서의 Argo Rollout 플러그인 설치
curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.4.0/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
# 로컬 PC가 MAC OS라면 위의 플러그인 설치 내용을 주석 처리한다.
#brew install argoproj/tap/kubectl-argo-rollouts
# Argo Rollout Dashboard 기동 (http://localhost:3100)
kubectl argo rollouts dashboard &
아래와 같이 설치가 끝나면 로컬 PC에서 3100 포트로 접근이 가능해진다.
Argo Rollout 사용하기 위해서 쿠버네티스 환경에서 Rollout 오브젝트가 필요하여
로컬 PC에서 아래와 같이 어플리케이션 매니패스트를 작성했다.
application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bubble-pool
namespace: argocd
spec:
destination:
namespace: bubblepool
server: https://kubernetes.default.svc
project: default
source:
path: bubblepool
repoURL: git@github.com:<github 유저명>/service-repository.git
targetRevision: HEAD
syncPolicy:
automated:
selfHeal: true
syncOptions:
- CreateNamespace=true
작성된 yaml 파일은 깃허브 내 service-repository 를 참조하며 아래와 같이 service.yaml, rollout.yaml 파일로 구성했다
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: bubble-pool
spec:
replicas: 3
strategy:
canary:
steps:
- setWeight: 33
- pause: {duration: 10}
- setWeight: 66
- pause: {duration: 10}
- setWeight: 99
revisionHistoryLimit: 2
selector:
matchLabels:
app: bubble-pool
template:
metadata:
labels:
app: bubble-pool
spec:
containers:
- name: bubble-pool
image: argoproj/rollouts-demo:red
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
apiVersion: v1
kind: Service
metadata:
name: bubble-pool
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: bubble-pool
externalTrafficPolicy: Cluster
sessionAffinity: None
type: LoadBalancer
application.yaml 파일을 kubectl로 배포할 경우 기존 ArgoCD 콘솔에서 새로운 어플리케이션이 확인되며, Argo Rollout 콘솔에서도 배포 상태를 확인 할 수 있다.
ArgoCD 콘솔
Argo Rollout 콘솔
GitHub 레포지토리에 저장된 롤아웃 오브젝트를 GitOps 기반으로 실행할 수 있으며
Argo Rollout이 설치된 환경에서 새로운 버전의 어플리케이션 배포 시 버전 변경 이력을 확인할 수 있다.
현재 배포한 bubble-pool 어플리케이션은 초기 버전으로 사이트에서 red-bubble을 출력하고 있으며, blue-burble을 출력하도록 버전을 업데이트하고 Argo Rollout 상에서도 해당 상태를 확인할 것이다.
앞서 설명했던 rollout.yaml 파일에서 컨테이너 이미지를 red > blue 버전으로 업데이트할 경우
canary 방식으로 배포되며, 해당 과정을 ArgoRollout으로도 확인 가능하다.
새로운 버전이 배포되면 ArgoRollout 콘솔에서도 적용되어 실시간으로 상태 확인이 가능하다.
burble-pool 어플리케이션은 rollout.yaml 파일에 설정된 배포정책에 따라 배포된다.
배포가 완료된 경우 burble-pool 어플리케이션에서도 확인 가능하며, ArgoRollout 콘솔에서도 적용 된다.