Argo CD
목적
Argo CD는 Lumie의 GitOps reconciler입니다. 한 번은 Ansible이 설치하고, 곧바로 applications/argocd app-of-apps 서브트리를 통해 자기 자신의 릴리스와 나머지 클러스터 소유권을 다시 Git으로 넘깁니다.
이 페이지는 Argo CD bootstrap, reconciliation 설정, 앱 등록, controller 동작을 변경하는 개발자를 위한 reference 문서입니다. 컨트롤러 간 흐름은 GitOps Overview를 참고하세요.
소스 경로
| 경로 | 역할 |
|---|---|
lumie-infra/provision/ansible/roles/argocd-bootstrap/tasks/main.yml | Helm을 이용한 Argo CD 첫 설치와 루트 Application CR의 초기 적용 |
lumie-infra/provision/ansible/roles/argocd-bootstrap/files/bootstrap-values.yaml | GitOps가 제어권을 넘겨받기 전의 최소 bootstrap 전용 Helm values |
lumie-infra/applications/argocd/argocd.yaml | self-managed Argo CD Application CR |
lumie-infra/applications/argocd/common-values.yaml | 중복 Service 또는 Deployment 리소스를 비활성화하는 공통 차트 wrapper |
lumie-infra/applications/argocd/helm-values.yaml | 런타임 controller, server, repo-server, Redis, metrics, ignore-differences 동작 |
lumie-infra/{bootstrap,platform,storage,security,observability,applications}/application.yaml | Argo CD가 reconcile하는 루트 Application |
퍼블릭 표면
Argo CD는 퍼블릭 ingress가 아니라 내부 control-plane 서비스입니다.
| 표면 | 소스 | 비고 |
|---|---|---|
argocd 네임스페이스의 Application CR | 루트 및 하위 앱 매니페스트 | Argo CD가 desired state를 감시하고 워크로드를 생성 또는 prune |
| Argo CD API server | applications/argocd/helm-values.yaml | server.ingress.enabled: false; 직접 ingress 대신 Teleport를 통한 접근 예상 |
| Metrics 서비스 | controller.metrics, server.metrics, repoServer.metrics | Prometheus 스크레이프를 위해 ServiceMonitor 활성화 |
bootstrap 전용 Helm 설치는 Git 관리 릴리스보다 의도적으로 약합니다. bootstrap values는 ApplicationSet과 notifications를 비활성화하고 리소스를 더 작게 잡아, 전체 구성이 Git에서 reconcile되기 전에 controller가 빠르게 시작되도록 합니다.
런타임 흐름
핵심 구성
이 발췌는 sync 동작을 읽을 때 중요한 활성 controller 계약을 보여줍니다.
configs:
cm:
users.anonymous.enabled: "true"
timeout.reconciliation: "60000"
resource.exclusions: |
- apiGroups:
- tekton.dev
kinds:
- PipelineRun
- TaskRun
params:
server.insecure: "true"
applications/argocd/helm-values.yaml의 중요한 런타임 선택은 다음과 같습니다.
Dex와 notifications는 비활성화됩니다.- ingress는 비활성화되어 있고, server는 외부 접근 계층 뒤에서 insecure mode로 실행됩니다.
- Tekton
PipelineRun과TaskRun리소스는 prune 대상에서 제외되어, Argo CD가 CI 런타임 오브젝트를 드리프트로 취급하지 않습니다. - self-managed
Application은 런타임에 Secret payload가 회전하는argocd-secret와argocd-initial-admin-secret의 diff를 무시합니다. - repo server는 많은 외부 Helm 차트를 렌더링하므로 API server보다 훨씬 크게 잡혀 있습니다.
소유권 경계
| 책임 | 소유자 |
|---|---|
| 초기 네임스페이스 생성, bootstrap 시크릿, 첫 Helm 설치 | Ansible role |
| 장기적인 Argo CD 버전, 리소스, controller 플래그, metrics, ignore-differences 규칙 | applications/argocd/** |
| 앱 등록 | Argo CD 차트 밖의 루트 및 하위 kustomization.yaml 파일 |
argocd-secret, TLS material 같은 런타임 시크릿 | Git이 아니라 Kubernetes 또는 외부 controller |
장애 및 드리프트 동작
| 장애 지점 | 동작 |
|---|---|
kustomization.yaml에 하위 등록 누락 | Argo CD가 앱을 보지 못해 Git 변경이 비활성 상태로 남음 |
| 런타임 관리 Secret 변경 | 명시된 Argo CD Secret에 대해서는 무시되어 OutOfSync 상태가 계속 발생하지 않음 |
Tekton PipelineRun 또는 TaskRun 변화 | resource.exclusions로 무시되어 CI가 GitOps 상태를 오염시키지 않음 |
| 저장소 렌더링 압력 | repoServer.resources.limits.memory는 외부 차트 렌더링이 가장 무거운 Argo 워크로드였기 때문에 3Gi로 설정됨 |
검증
cd lumie-infra
rg -n "users.anonymous.enabled|resource.exclusions|CreateNamespace|ignoreDifferences" \
applications/argocd provision/ansible/roles/argocd-bootstrap
kubectl get applications -n argocd
kubectl get application argocd -n argocd -o yaml
성공은 다음을 의미합니다. 저장소 grep에서 anonymous access, Tekton exclusion, namespace 생성, ignore-difference 규칙이 계속 보이고, 라이브 클러스터에서 argocd Application이 Synced/Healthy이며, kubectl get application argocd -o yaml에 저장소가 관리하는 Helm values 소스가 포함됩니다.