23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Blue/Green 배포란?
Blue를 구버전, Green을 새로운 버전으로 가정한다면, 운영 환경에 기존 버전인 Blue와 동일하게 새로운 Green 버전의 인스턴스를 구성하고,
테스트를 완료 후 라이브 트래픽을 로드밸런서를 통해 새로운 버전으로 전환하는 형태의 배포 방식입니다.
장점:
새로운 버전을 구버전과 동일한 운영 환경으로 인스턴스를 구성하기 때문에 실제 운영 환경에서 새로운 버전을 테스트 후 버전을 바꿀 수 있는 장점이 있고
트래픽을 다시 구버전으로 돌릴 수 있으므로 빠른 롤백이 가능합니다.
단점:
Blue/Green 배포를 위해서는 시스템 자원이 두 배로 필요로하기 때문에 비용등의 단점이 있을 수 있습니다.
왜 Argo CD 를 이용해서 Blue/Green 배포를 해야 하는가?
K8S의 기본적인 배포 방식: Rolling update
롤링 업데이트란 새 버전을 배포하면서, 새 버전 파드를 하나씩 늘려가고 기존 버전의 파드를 하나씩 줄여나가는 방식입니다.
무중단 배포 라고도 합니다.
이전 버전과 새로운 버전이 공존하는 시간이 발생한다는 단점이 있습니다.
단점:
Rollout 속도에 대한 제어가 어렵고
새로운 버전으로 트래픽 흐름을 제어할 수 없으며
업데이트 진행을 중단할 수 있지만, 업데이트를 자동으로 중단하고 롤백하는 등의 심화된 기능이 없습니다.
Blue/Green 배포시 발생하는 문제:
blast radius(문제 발생시 그로 인한 영향 범위)에 대한 제어가 없고
공격적으로 Rollout 할 수 있으며
실패 시 자동 롤백을 제공하지 않으므로 위험합니다.
Argo Rollout 을 사용한다면?
Blue/Green update 전략을 사용 가능하고
자동 롤백이 가능합니다
minikube start
kubectl create namespace argo-rollouts
kubectl get all -n argo-rolloutsKubectl 에 argo-rollout plugin 설치합니다.
# M1 mac 기준
# Intel mac 의 경우 amd64로 설치
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-darwin-arm64
chmod +x ./kubectl-argo-rollouts-darwin-arm64
sudo mv ./kubectl-argo-rollouts-darwin-arm64 /usr/local/bin/kubectl-argo-rollouts
kubectl argo rollouts version우선 rollout.yaml 을 작성하여 서비스를 배포하겠습니다.
ref: https://gomgomshrimp.oopy.io/posts/2
strategy: 하위에 배포 전략을 선택하며 여기서는 blueGreen을 명시
blueGreen
activeService: 현재 운영 중인 application에 연결될 서비스
previewService: 변경될 application에 연결될 서비스
# rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: 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
imagePullPolicy: Always
ports:
- containerPort: 8080
strategy:
blueGreen:
activeService: rollout-bluegreen-active
previewService: rollout-bluegreen-preview
autoPromotionEnabled: false
---
kind: Service
apiVersion: v1
metadata:
name: rollout-bluegreen-active
spec:
type: NodePort
selector:
app: rollout-bluegreen
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30081
---
kind: Service
apiVersion: v1
metadata:
name: rollout-bluegreen-preview
spec:
type: NodePort
selector:
app: rollout-bluegreen
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30082https://github.com/argoproj/rollouts-demo 에서 제공하는 데모용 이미지를 사용하였고, 사각형 타일들의 색 (Blue/Green) 이 변경되는 데모입니다.
Pod 생성
kubectl apply -f rollout.yaml생성된 pod 확인
kubectl argo rollouts get rollout rollout-bluegreen --watchRed box 는 Rollout-pod-template-hash 를 나타냅니다. 두 개의 pod이 동일한 replicaset 과 연결된 것을 확인할 수 있습니다.
# service 확인
# kubectl get svc 명령어의 IP 로 접근할 수 없는건 minikube 클러스터를 따로 사용하고 있기 때문
# 포트프록시를 따로 설정하기 귀찮기 때문에 아래 방식으로 웹브라우저접근
minikube service rollout-bluegreen-active
minikube service rollout-bluegreen-preview양쪽 다 Blue 로 배포되어 있음을 알 수 있습니다.
이제 Rollout의 이미지 버전을 Blue -> Green 으로 변경하여 재배포합니다. (rollout.yaml 파일 수정)
# rollout.yaml 에서 line 18 수정
# image: argoproj/rollouts-demo:blue
image: argoproj/rollouts-demo:greenkubectl apply -f rollout.yamlPreview 가 Green 으로 변경된 것을 확인할 수 있습니다.
이렇게 Green 버전 테스트를 마쳤다면, 최종으로 Green 버전으로 변경하는 작업을 수행합니다.
만약 yaml 파일에서 autoPromotionEnabled: true 옵션을 사용했다면 자동으로 Green 이 최종 적용된다
작업자의 승인이 있어야 교체가 발생되도록 하는 옵션이므로 안정성을 위해서 false 로 놓는 것이 좋다.
옵션에 따라서 특정 시간이 지난 후 자동 교체되도록 할 수 있음
→ autoPromotionSeconds: 20 등의 옵션
kubectl argo rollouts promote rollout-bluegreenRevision 1 이 완전히 종료된 것을 볼 수 있습니다.
Active 와 Preview 모두 Green 버전으로 배포된 것을 확인했습니다.
배포한 Green 에서 뒤늦게 문제가 발견되어 rollback 을 시도하는 상황을 살펴보겠습니다.
kubectl argo rollouts undo rollout-bluegreen아주 간단하게 rollback 이 가능합니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.