LabHub

CNPE — 클라우드 네이티브 플랫폼 엔지니어 (전문가) · GitOps 와 지속적 배포 · 실습

배포 게이트와 진행형 배포 설계

LabHub 에서 이어서 보기

목표

kustomize base 와 운영 오버레이를 만들고, 렌더 결과에 스키마와 정책 게이트를 걸고, 그 게이트가 위반을 실제로 막는지 확인합니다. 그다음 카나리와 블루/그린을 각각 어떤 서비스에 붙일지 정해 Rollout 으로 옮깁니다.

왜 중요한가

CNPE 의 GitOps 영역은 배점이 25% 로 가장 큽니다. 그리고 이 영역에서 실무와 시험이 함께 요구하는 것은 도구 사용법이 아니라 순서입니다. 렌더가 먼저이고 검사가 그다음이며, 검사 결과는 반드시 종료 코드가 되어야 합니다. 이 순서를 지키지 않은 파이프라인은 초록불을 내면서 아무것도 지키지 않습니다.

이 실습의 클러스터에는 Argo CD 컨트롤러도 Argo Rollouts 컨트롤러도 없습니다. CRD 만 등록돼 있어서 매니페스트는 진짜로 검증되고 저장되지만, 조정(reconcile)은 일어나지 않습니다. 그래서 여기서 배우는 것은 "컨트롤러가 뭘 해 주나" 가 아니라 "내가 무엇을 선언했는가" 입니다. 실제 시험에서도 채점되는 것은 선언입니다.

작업 디렉터리는 /root/cnpe-delivery 이고, 운영 네임스페이스는 cnpe-prod 입니다.

단계

1. /root/cnpe-delivery/base 에 Deployment checkout 과 Service checkout 을 만들고 kustomization.yaml 로 묶습니다. 컨테이너 포트와 Service 의 targetPort 는 8080, replicas 는 1 입니다. base 에는 네임스페이스를 넣지 않습니다.
2. /root/cnpe-delivery/overlays/prod 에 운영 오버레이를 만듭니다. 네임스페이스는 cnpe-prod, replicas 는 4, 이미지는 다이제스트(@sha256: 뒤 16진수 64자리)로 고정하고, 컨테이너에 requests 와 limits 를 모두 넣고 runAsNonRoot: true 를 겁니다.
3. /root/cnpe-delivery/policy/require-pinned.yaml 에 Kyverno ClusterPolicy 를 씁니다. validationFailureActionEnforce 이고, Deployment 를 대상으로 (가) 이미지가 다이제스트로 고정됐는지 (나) 모든 컨테이너에 resources.limits.cpumemory 가 있는지 두 가지를 검사합니다.
4. /root/cnpe-delivery/gate.sh 를 만듭니다. prod 오버레이를 렌더하고 그 결과에 정책을 적용해, 위반이 있으면 0 이 아닌 코드로 끝나야 합니다. 어디서 호출해도 같게 동작하도록 스크립트가 자기 위치로 먼저 이동하게 만드십시오.
5. /root/cnpe-delivery/rollout/checkout-canary.yaml 에 카나리 Rollout checkout 을 쓰고 cnpe-prod 에 적용합니다. setWeight 는 10, 30, 60 순서이고 그 사이마다 pause 를 두며, 첫 단계는 setWeight 여야 합니다. canaryServicestableService 를 서로 다르게 두고 progressDeadlineSeconds 는 600 이하로 잡습니다. 컨테이너 이미지는 prod 렌더 결과의 이미지와 정확히 같아야 합니다.
6. /root/cnpe-delivery/argocd/application.yaml 에 Argo CD Application 을 씁니다. projectdefault 가 아닌 전용 프로젝트, source.pathoverlays/prod, targetRevisionHEAD 가 아닌 고정 참조, syncPolicy.automated 에 prune 과 selfHeal 을 켜고 syncOptionsCreateNamespace=true 를 넣습니다. destination.namespace 는 렌더 결과의 네임스페이스와 같아야 합니다.
7. /root/cnpe-delivery/rollout/ledger-bluegreen.yaml 에 AnalysisTemplate ledger-smoke 와 블루/그린 Rollout ledger 를 쓰고 cnpe-prod 에 적용합니다. activeServicepreviewService 는 서로 다르고, autoPromotionEnabled 는 false, prePromotionAnalysisledger-smoke 를 참조하며, scaleDownDelaySeconds 는 300 이상입니다.
8. /root/cnpe-delivery/delivery-report.txtprod_image, prod_replicas, canary_weights, auto_promotion 네 줄을 키=값 형식으로 적습니다. 값은 전부 렌더 결과와 클러스터에서 직접 조회한 것이어야 합니다.

참고

단계 8개

  1. base 를 만들고 렌더가 되는지 확인
  2. 운영 오버레이가 무엇을 더하는지
  3. 정책으로 무엇을 막을지 정하기
  4. 게이트가 실제로 막는지 확인
  5. 카나리에 판단할 자리를 만들기
  6. 동기화 대상과 목적지를 못박기
  7. 쓰기를 나눌 수 없는 서비스의 전략
  8. 배포 기록을 값으로 남기기