Canary, Blue-Green and Rolling Back
한국어 원문으로 표시합니다.
목표
카나리와 블루그린 Rollout 매니페스트, 그리고 지표 기반 자동 롤백을 담당하는 AnalysisTemplate 을 작성하고, 대응되는 Service 와 Deployment 를 실제로 올려 롤아웃과 되돌리기를 손으로 수행합니다.
왜 중요한가
점진적 배포의 핵심은 "새 버전을 얼마나 노출할지" 와 "무엇을 보고 계속할지 결정할지" 두 가지입니다. setWeight 는 앞의 답이고 analysis 는 뒤의 답입니다. duration 없는 pause 는 그 판단을 사람에게 넘기는 자리이고, AnalysisTemplate 은 같은 판단을 지표에 맡기는 자리입니다. 한편 되돌리기 자체는 Argo Rollouts 의 발명이 아니라 쿠버네티스가 ReplicaSet 을 리비전으로 남겨 두기 때문에 가능한 일입니다. 이 실습에서 두 층을 모두 만져 보면 Rollout 이 어디까지 새로운 것인지 구분이 섭니다.
단계
/root/capa-rollout/디렉터리를 만들고rollout.yaml에 apiVersionargoproj.io/v1alpha1, kindRollout,metadata.namecapa-web,metadata.namespacecapa-rollout,spec.replicas4,spec.selector.matchLabels.appcapa-web, 컨테이너 이미지nginx:1.27을 쓰세요.- 같은 파일의
spec.strategy.canary.steps를 다섯 개 이상으로 만들되, 첫 스텝은setWeight: 20, 두 번째는pause: {duration: 30s}, 세 번째는setWeight: 50, 마지막 스텝은setWeight: 100이 되게 하세요. /root/capa-rollout/analysistemplate.yaml에 kindAnalysisTemplate,metadata.namecapa-success-rate를 쓰고spec.metrics[0]에 namesuccess-rate, interval30s, failureLimit3,0.95이상을 요구하는 successCondition, 그리고provider.prometheus.address를 채우세요.rollout.yaml의 카나리 스텝 중 하나를analysis스텝으로 만들어templates[0].templateName이capa-success-rate를 가리키게 하고,spec.strategy.canary.canaryService를capa-web-canary,stableService를capa-web-stable,trafficRouting.nginx.stableIngress를capa-web-stable로 지정하세요./root/capa-rollout/rollout-bluegreen.yaml에 kindRollout,metadata.namecapa-api를 쓰고spec.strategy.blueGreen아래에 activeServicecapa-api-active, previewServicecapa-api-preview, autoPromotionEnabledfalse, scaleDownDelaySeconds60을 넣으세요. 이 파일에는 canary 를 함께 쓰지 마세요.- 클러스터에 네임스페이스
capa-rollout을 만들고 그 안에 Servicecapa-web-stable과capa-web-canary를 실제로 만드세요. 둘 다 typeClusterIP,spec.selector.appcapa-web, 포트80입니다. - 같은 네임스페이스에 Deployment
capa-web을 실제로 만드세요.replicas는4,spec.selector.matchLabels.app은capa-web, 컨테이너 이미지는nginx:1.27입니다. capa-web의 이미지를nginx:1.28로 한 번 바꿔 새 리비전을 만든 뒤 되돌리세요. 최종 상태는 이미지가 다시nginx:1.27이고 리비전 번호가 3 이상이어야 합니다.
참고
kubectl set image deploy/capa-web nginx=nginx:1.28 -n capa-rollout와kubectl rollout undo deploy/capa-web -n capa-rollout를 씁니다.- 리비전은
kubectl rollout history deploy/capa-web -n capa-rollout로 확인할 수 있습니다. - 흔한 실수 1: 되돌린 뒤 리비전이 줄어들 것이라 기대하는 것. 되돌리기도 새 리비전으로 기록됩니다.
- 흔한 실수 2: 한 Rollout 에 canary 와 blueGreen 을 같이 쓰는 것. 전략은 하나만 고를 수 있습니다.
Rollout 골격
/root/capa-rollout/ 디렉터리를 만들고 rollout.yaml 에 apiVersion argoproj.io/v1alpha1, kind Rollout, metadata.name capa-web, metadata.namespace capa-rollout, spec.replicas 4, spec.selector.matchLabels.app capa-web, 컨테이너 이미지 nginx:1.27 을 쓰세요.
Rollout 의 spec 은 replicas·selector·template 까지 Deployment 와 거의 같습니다. 다른 것은 strategy 아래에 들어가는 내용입니다.
가중치와 멈춤 스텝
같은 파일의 spec.strategy.canary.steps 를 다섯 개 이상으로 만들되, 첫 스텝은 setWeight: 20, 두 번째는 pause: {duration: 30s}, 세 번째는 setWeight: 50, 마지막 스텝은 setWeight: 100 이 되게 하세요.
steps 는 배열이고 각 원소는 setWeight 또는 pause 같은 키를 하나 가집니다. pause 에 duration 을 주면 시간 대기, 주지 않으면 사람이 승격할 때까지 무한 대기입니다.
AnalysisTemplate 작성
/root/capa-rollout/analysistemplate.yaml 에 kind AnalysisTemplate, metadata.name capa-success-rate 를 쓰고 spec.metrics[0] 에 name success-rate, interval 30s, failureLimit 3, 0.95 이상을 요구하는 successCondition, 그리고 provider.prometheus.address 를 채우세요.
metrics 항목에는 얼마마다 잴지, 무엇을 성공으로 볼지, 몇 번까지 실패를 봐줄지, 어디서 가져올지가 모두 필요합니다. 네 가지 중 하나라도 빠지면 판단이 성립하지 않습니다.
분석 스텝과 트래픽 라우팅 연결
rollout.yaml 의 카나리 스텝 중 하나를 analysis 스텝으로 만들어 templates[0].templateName 이 capa-success-rate 를 가리키게 하고, spec.strategy.canary.canaryService 를 capa-web-canary, stableService 를 capa-web-stable, trafficRouting.nginx.stableIngress 를 capa-web-stable 로 지정하세요.
analysis 스텝은 templates 배열로 AnalysisTemplate 이름을 참조합니다. 트래픽 비율을 실제로 나누려면 카나리용과 안정용 서비스 이름을 컨트롤러에 알려 줘야 합니다.
블루그린 전략
/root/capa-rollout/rollout-bluegreen.yaml 에 kind Rollout, metadata.name capa-api 를 쓰고 spec.strategy.blueGreen 아래에 activeService capa-api-active, previewService capa-api-preview, autoPromotionEnabled false, scaleDownDelaySeconds 60 을 넣으세요. 이 파일에는 canary 를 함께 쓰지 마세요.
블루그린은 새 버전을 전량 띄워 두고 preview 로만 접근하다가 active 를 갈아 끼웁니다. 자동 승격을 끄는 필드와 옛 버전을 얼마나 살려 둘지 정하는 필드가 각각 있습니다.
안정·카나리 서비스 두 개 만들기
클러스터에 네임스페이스 capa-rollout 을 만들고 그 안에 Service capa-web-stable 과 capa-web-canary 를 실제로 만드세요. 둘 다 type ClusterIP, spec.selector.app capa-web, 포트 80 입니다.
여기서부터 실제 클러스터입니다. 두 서비스의 셀렉터는 같아도 됩니다. 컨트롤러가 나중에 셀렉터를 조작해 트래픽을 가릅니다.
대응되는 Deployment 올리기
같은 네임스페이스에 Deployment capa-web 을 실제로 만드세요. replicas 는 4, spec.selector.matchLabels.app 은 capa-web, 컨테이너 이미지는 nginx:1.27 입니다.
서비스 셀렉터와 같은 라벨을 파드 템플릿에 달아야 엔드포인트가 잡힙니다. 레플리카 수는 Rollout 파일과 맞추세요.
올렸다가 되돌리기
capa-web 의 이미지를 nginx:1.28 로 한 번 바꿔 새 리비전을 만든 뒤 되돌리세요. 최종 상태는 이미지가 다시 nginx:1.27 이고 리비전 번호가 3 이상이어야 합니다.
이미지를 한 번 바꿔 새 리비전을 만든 뒤 되돌립니다. 되돌린 뒤에도 리비전 번호는 줄지 않고 늘어난다는 점을 확인하세요.