LabHub
배우기 러닝패스 코스

CAPA — Argo Project Associate

Canary, Blue-Green and Rolling Back

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

카나리와 블루그린 Rollout 매니페스트, 그리고 지표 기반 자동 롤백을 담당하는 AnalysisTemplate 을 작성하고, 대응되는 Service 와 Deployment 를 실제로 올려 롤아웃과 되돌리기를 손으로 수행합니다.

왜 중요한가

점진적 배포의 핵심은 "새 버전을 얼마나 노출할지" 와 "무엇을 보고 계속할지 결정할지" 두 가지입니다. setWeight 는 앞의 답이고 analysis 는 뒤의 답입니다. duration 없는 pause 는 그 판단을 사람에게 넘기는 자리이고, AnalysisTemplate 은 같은 판단을 지표에 맡기는 자리입니다. 한편 되돌리기 자체는 Argo Rollouts 의 발명이 아니라 쿠버네티스가 ReplicaSet 을 리비전으로 남겨 두기 때문에 가능한 일입니다. 이 실습에서 두 층을 모두 만져 보면 Rollout 이 어디까지 새로운 것인지 구분이 섭니다.

단계

  1. /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 을 쓰세요.
  2. 같은 파일의 spec.strategy.canary.steps 를 다섯 개 이상으로 만들되, 첫 스텝은 setWeight: 20, 두 번째는 pause: {duration: 30s}, 세 번째는 setWeight: 50, 마지막 스텝은 setWeight: 100 이 되게 하세요.
  3. /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 를 채우세요.
  4. rollout.yaml 의 카나리 스텝 중 하나를 analysis 스텝으로 만들어 templates[0].templateNamecapa-success-rate 를 가리키게 하고, spec.strategy.canary.canaryServicecapa-web-canary, stableServicecapa-web-stable, trafficRouting.nginx.stableIngresscapa-web-stable 로 지정하세요.
  5. /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 를 함께 쓰지 마세요.
  6. 클러스터에 네임스페이스 capa-rollout 을 만들고 그 안에 Service capa-web-stablecapa-web-canary 를 실제로 만드세요. 둘 다 type ClusterIP, spec.selector.app capa-web, 포트 80 입니다.
  7. 같은 네임스페이스에 Deployment capa-web 을 실제로 만드세요. replicas4, spec.selector.matchLabels.appcapa-web, 컨테이너 이미지는 nginx:1.27 입니다.
  8. capa-web 의 이미지를 nginx:1.28 로 한 번 바꿔 새 리비전을 만든 뒤 되돌리세요. 최종 상태는 이미지가 다시 nginx:1.27 이고 리비전 번호가 3 이상이어야 합니다.

참고

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].templateNamecapa-success-rate 를 가리키게 하고, spec.strategy.canary.canaryServicecapa-web-canary, stableServicecapa-web-stable, trafficRouting.nginx.stableIngresscapa-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-stablecapa-web-canary 를 실제로 만드세요. 둘 다 type ClusterIP, spec.selector.app capa-web, 포트 80 입니다.

여기서부터 실제 클러스터입니다. 두 서비스의 셀렉터는 같아도 됩니다. 컨트롤러가 나중에 셀렉터를 조작해 트래픽을 가릅니다.

대응되는 Deployment 올리기

같은 네임스페이스에 Deployment capa-web 을 실제로 만드세요. replicas4, spec.selector.matchLabels.appcapa-web, 컨테이너 이미지는 nginx:1.27 입니다.

서비스 셀렉터와 같은 라벨을 파드 템플릿에 달아야 엔드포인트가 잡힙니다. 레플리카 수는 Rollout 파일과 맞추세요.

올렸다가 되돌리기

capa-web 의 이미지를 nginx:1.28 로 한 번 바꿔 새 리비전을 만든 뒤 되돌리세요. 최종 상태는 이미지가 다시 nginx:1.27 이고 리비전 번호가 3 이상이어야 합니다.

이미지를 한 번 바꿔 새 리비전을 만든 뒤 되돌립니다. 되돌린 뒤에도 리비전 번호는 줄지 않고 늘어난다는 점을 확인하세요.