CNPE — 클라우드 네이티브 플랫폼 엔지니어 (전문가) · GitOps 와 지속적 배포 · 실습
배포 게이트와 진행형 배포 설계
목표
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 를 씁니다. validationFailureAction 은 Enforce 이고, Deployment 를 대상으로 (가) 이미지가 다이제스트로 고정됐는지 (나) 모든 컨테이너에 resources.limits.cpu 와 memory 가 있는지 두 가지를 검사합니다.
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 여야 합니다. canaryService 와 stableService 를 서로 다르게 두고 progressDeadlineSeconds 는 600 이하로 잡습니다. 컨테이너 이미지는 prod 렌더 결과의 이미지와 정확히 같아야 합니다.
6. /root/cnpe-delivery/argocd/application.yaml 에 Argo CD Application 을 씁니다. project 는 default 가 아닌 전용 프로젝트, source.path 는 overlays/prod, targetRevision 은 HEAD 가 아닌 고정 참조, syncPolicy.automated 에 prune 과 selfHeal 을 켜고 syncOptions 에 CreateNamespace=true 를 넣습니다. destination.namespace 는 렌더 결과의 네임스페이스와 같아야 합니다.
7. /root/cnpe-delivery/rollout/ledger-bluegreen.yaml 에 AnalysisTemplate ledger-smoke 와 블루/그린 Rollout ledger 를 쓰고 cnpe-prod 에 적용합니다. activeService 와 previewService 는 서로 다르고, autoPromotionEnabled 는 false, prePromotionAnalysis 는 ledger-smoke 를 참조하며, scaleDownDelaySeconds 는 300 이상입니다.
8. /root/cnpe-delivery/delivery-report.txt 에 prod_image, prod_replicas, canary_weights, auto_promotion 네 줄을 키=값 형식으로 적습니다. 값은 전부 렌더 결과와 클러스터에서 직접 조회한 것이어야 합니다.
참고
- 렌더 결과를 읽을 때는
kustomize build overlays/prod | yq -o=json -I=0 ea '[.]' | jq ...가 편합니다. kyverno apply <정책> --resource <파일>은 위반이 있으면 종료 코드 1 을 냅니다. 이 값을 그대로 게이트의 판단 근거로 쓰십시오.- 카나리 가중치는
kubectl get rollout checkout -n cnpe-prod -o jsonpath='{.spec.strategy.canary.steps[*].setWeight}'로 다시 셀 수 있습니다. - 흔한 실수 하나는 오버레이가 base 를 절대 경로로 가리키는 것입니다. 상대 경로로 두어야 저장소를 통째로 옮겨도 렌더됩니다.
- 또 하나는 게이트를 만들어 놓고 통과만 확인하는 것입니다. 일부러 위반을 넣어 빨간불을 한 번 보십시오.
단계 8개
- base 를 만들고 렌더가 되는지 확인
- 운영 오버레이가 무엇을 더하는지
- 정책으로 무엇을 막을지 정하기
- 게이트가 실제로 막는지 확인
- 카나리에 판단할 자리를 만들기
- 동기화 대상과 목적지를 못박기
- 쓰기를 나눌 수 없는 서비스의 전략
- 배포 기록을 값으로 남기기