GitOps 와 ArgoCD · Argo CD 설정을 배포 전에 읽어 본다 · 이론
스키마 없는 ConfigMap 한 장이 플랫폼을 정한다
한 줄 요약
argocd-cm 은 스키마가 없는 ConfigMap 이라 오타가 오류가 아니라 '설정 없음' 이 되고,argocd admin settings validate 는 그것을 검사해 주는 도구가 아니라 읽어 낸 값을 되돌려 주는 도구다.
왜 이 확인이 필요했나
Argo CD 를 선언으로 관리하기 시작하면 argocd-cm 한 장이 커진다. 계정, SSO, kustomize 빌드 옵션,
감시하지 않을 종류, 소유 표시 방식, 헬스 규칙, 무시 규칙, 리소스 동작이 전부 이 파일의 키로 들어온다.
문제는 이 파일이 평범한 ConfigMap 이라는 점이다. 쿠버네티스는 키 이름을 검사하지 않는다.kustomize.buildOptions 를 kustomize.buildOption 으로 적어도 apply 는 성공하고, Argo CD 는
그 키를 모르니 그냥 지나친다. 화면 어디에도 경고가 없다.
이 종류의 실수는 아주 오래 산다. 옵션이 안 먹는다는 것은 보통 다른 일을 하다가 우연히 발견되고,
그때쯤이면 그 줄을 누가 왜 넣었는지 아무도 기억하지 못한다.
어떻게 동작하나
argocd admin settings validate 는 argocd-cm(과 필요하면 argocd-secret)을 읽어 다섯 절로 나눠
해석한 결과를 출력한다.
✅ accounts 3 accounts✅ general Dex is configured✅ kustomize --enable-helm✅ repositories 1 repositories✅ resource-overrides 2 resource overrides여기서 읽는 법이 중요하다. ✅ 는 "그 절을 읽는 데 실패하지 않았다" 는 뜻이지 "설정이 옳다" 는 뜻이 아니다.
실제 정보는 그 아래 줄에 있다. 계정을 두 개 더했는데 숫자가 그대로면 키 이름이 틀린 것이고,
빌드 옵션을 넣었는데 default options 가 나오면 그 옵션은 없는 것이다. 즉 이 명령은 린터가 아니라
되읽기다. 내가 넣은 값이 되돌아 나오는지를 보는 용도로 써야 값어치가 난다.
그리고 한계가 있다. 모든 설정이 이 다섯 절에 나타나지는 않는다. resource.exclusions 와resource.inclusions 는 어느 절에도 요약되지 않는다. 이런 키는 파일을 직접 파싱해 확인하는 수밖에 없다.inclusions 는 특히 조심해야 한다 — 하나라도 적는 순간 거기 없는 종류는 전부 보이지 않게 된다.
소유 표시 설정도 알아 둘 값어치가 있다. application.resourceTrackingMethod 가 label 이면 Argo CD 는app.kubernetes.io/instance 같은 라벨에 앱 이름을 적는다. 그런데 라벨 값은 63자를 넘을 수 없다.
조직이 커져 앱 이름이 길어지면 이 한도에 부딪히고, 잘린 이름 때문에 서로 다른 앱이 같은 소유 표시를
갖게 된다 — 한 앱의 동기화가 다른 앱의 자원을 건드리는 사고가 여기서 나온다. annotation 방식은argocd.argoproj.io/tracking-id 주석에 적으므로 길이 제한이 없고, 그래서 지금 권장되는 방식이다.
저장소도 두 세대가 섞여 있다. argocd-cm 의 repositories 목록은 예전 방식이고, 지금은 저장소 하나에
Secret 하나를 두고 argocd.argoproj.io/secret-type: repository 라벨을 붙인다. 자격 증명을 함께 담을 수
있는 것이 큰 차이다. 여기서도 조용한 실패가 있다 — 라벨을 빠뜨리면 Argo CD 가 그 Secret 을 못 본다.
오류는 나지 않는다.
현장에서 만나는 모습
가장 흔한 장면은 "Helm 을 쓰는 kustomize 빌드가 안 된다" 는 문의다. kustomize.buildOptions 를 넣었다는데
실제 파일에는 buildOption 이라고 적혀 있다. 이 명령 한 번이면 3초에 끝나는 일인데, 없으면 컨트롤러 로그와
파드 재시작을 오가며 반나절을 쓴다.
두 번째는 제외 목록을 잘못 건드리는 일이다. 부하를 줄이려고 resource.inclusions 에 몇 종류만 적었더니
그 밖의 모든 자원이 앱 트리에서 사라진다. 사람들은 자원이 삭제된 줄 알고 패닉한다. 이 설정은
validate 출력에 나타나지 않으므로, 바꾸기 전에 파일을 직접 읽고 뭘 남기는지 세어 봐야 한다.
세 번째는 이전이다. 라벨 방식에서 주석 방식으로 바꾸면 Argo CD 는 옛 라벨이 붙은 자원을 자기 것으로
알아보지 못할 수 있다. 그래서 이 변경은 조용히 하는 것이 아니라 **바꾸기 전후의 읽어 낸 값을 파일로
남겨 리뷰에 붙이는** 변경이다. 이 실습의 마지막 단계가 바로 그 습관이다.
이 실습 환경의 한계
실습 파드에는 Argo CD 컨트롤러와 서버가 없다. 그래서 설정을 바꾸고 화면이 달라지는 것을 볼 수 없고,
SSO 로 로그인해 보는 것도 할 수 없다. 대신 설정을 실제로 해석하는 코드가 CLI 안에 있어서, 무엇이 읽혔고
무엇이 무시됐는지는 정확히 같은 결과로 확인할 수 있다. 저장소 Secret 과 소유 표시 주석은 kwok
클러스터에 실제로 올려 본다.
다음 실습에서 할 것
빈 설정의 되읽기부터 시작해 계정, 빌드 옵션, 제외 목록, 소유 표시, 저장소를 한 항목씩 더한다.
중간에 키 이름을 일부러 한 글자 틀려 그것이 어떻게 조용히 사라지는지 본다. 라벨 63자 한도는 kwok
클러스터에서 직접 부딪혀 보고, 마지막에는 처음과 끝의 되읽기를 diff 로 남긴다.