CAPA — Argo 프로젝트 인증 어소시에이트 · Argo CD 핵심 · 실습
Application 매니페스트 조립하기
목표
Argo CD Application 매니페스트를 필드 하나씩 쌓아 완성하고, 그 앱이 배포하게 될 네임스페이스와 디플로이먼트를 실제 클러스터에 올려 Argo CD 가 자기 리소스를 알아보는 방식까지 손으로 확인합니다.
왜 중요한가
Application 은 "무엇을(source) 어디에(destination) 어떤 규칙으로(syncPolicy) 맞출 것인가" 를 적은 선언문입니다. 필드 이름을 외우는 것보다 각 필드가 어떤 사고를 막으려고 생겼는지 아는 것이 중요합니다. prune 을 켜지 않으면 Git 에서 지운 리소스가 클러스터에 영원히 남고, selfHeal 을 켜면 손으로 고친 값이 되돌아가며, ignoreDifferences 없이 HPA 를 쓰면 Argo CD 와 HPA 가 replicas 를 두고 끝없이 싸웁니다. 이 실습에서 만드는 파일은 그 사고들을 하나씩 예방하는 순서로 쌓입니다.
단계
1. /root/capa-app/ 디렉터리를 만들고 그 안에 application.yaml 을 만드세요. apiVersion 은 argoproj.io/v1alpha1, kind 는 Application, metadata.name 은 guestbook, metadata.namespace 는 argocd 입니다.
2. 같은 파일에 spec.project 를 capa-demo 로, spec.source.repoURL 을 https://gitea.homelab.internal/platform/guestbook.git, spec.source.targetRevision 을 main, spec.source.path 를 overlays/prod 로 채우세요.
3. spec.destination.server 를 https://kubernetes.default.svc, spec.destination.namespace 를 capa-guestbook 으로 지정하세요. destination.name 은 쓰지 마세요.
4. spec.syncPolicy.automated.prune 과 spec.syncPolicy.automated.selfHeal 을 둘 다 true 로 두고, spec.syncPolicy.syncOptions 에 CreateNamespace=true 와 PruneLast=true 두 항목을 넣으세요.
5. spec.syncPolicy.retry.limit 을 5, spec.syncPolicy.retry.backoff.duration 을 5s, factor 를 2, maxDuration 을 3m 으로 지정하세요.
6. spec.ignoreDifferences 의 첫 항목에 group: apps, kind: Deployment, jsonPointers 에 /spec/replicas 를 넣어 HPA 가 관리하는 필드를 비교에서 빼세요.
7. 클러스터에 네임스페이스 capa-guestbook 을 실제로 만들고 라벨 app.kubernetes.io/part-of=capa 를 붙이세요.
8. 네임스페이스 capa-guestbook 에 디플로이먼트 guestbook-ui 를 실제로 만드세요. replicas 는 2, 컨테이너 이미지는 nginx:1.27, 그리고 디플로이먼트 자신의 어노테이션으로 argocd.argoproj.io/tracking-id 를 Argo CD 형식에 맞게 붙이세요. 앱 이름은 guestbook 입니다.
참고
- 파일 검증은
yq '.spec.syncPolicy' /root/capa-app/application.yaml처럼 부분만 뽑아 보면 빠릅니다. - 실제 리소스는
kubectl create ... --dry-run=client -o yaml로 뼈대를 뽑은 뒤 편집하는 편이 오타가 적습니다. - 흔한 실수 1:
syncOptions를 맵으로 쓰는 것. 문자열 배열입니다. - 흔한 실수 2: 추적 ID 의 코어 그룹 표기. apps 그룹 리소스와 코어 그룹 리소스의 형태가 다릅니다.
단계 8개
- 작업 디렉터리와 Application 골격
- source — 무엇을 가져올 것인가
- destination — 어디에 놓을 것인가
- 자동 동기화와 syncOptions
- 재시도 백오프 설계
- HPA 가 관리하는 필드를 diff 에서 빼기
- 대상 네임스페이스를 실제로 만들기
- 추적 어노테이션까지 붙인 디플로이먼트