ArgoCD Sync Option: CreateNamespace
정의 (Definition)
**CreateNamespace=true**는 ArgoCD Application의 배포 대상(Destination) 네임스페이스가 클러스터에 존재하지 않을 경우, Sync 시점에 ArgoCD가 “빈 네임스페이스”를 자동으로 생성하도록 허용하는 Sync Option입니다.
문제가 되는 배경 (Problem Context)
Kubernetes 리소스를 배포하려면 해당 네임스페이스가 먼저 존재해야 합니다. 하지만 GitOps 파이프라인에서 “네임스페이스 생성”을 별도 작업(수동 kubectl 등)으로 분리하면 자동화의 흐름이 끊깁니다. 이를 해결하기 위해 ArgoCD가 네임스페이스 생성까지 대행하게 하지만, 이는 **네임스페이스 레벨의 정책(Quota, RBAC, NetworkPolicy)**이 누락된 채 생성될 위험을 동반합니다.
핵심 메커니즘 (How it Works)
- ArgoCD Controller는 Application 매니페스트의
spec.destination.namespace를 확인합니다. - 해당 네임스페이스가 없으면,
syncOptions에CreateNamespace=true가 있는지 확인합니다. - 있다면, ArgoCD는 기본값(Labels/Annotations 없는 상태)으로 네임스페이스를 생성한 후 리소스를 배포합니다.
불변 조건과 보장 범위 (Invariants & Guarantees)
- 내용 없는 생성: 이 옵션으로 생성된 네임스페이스는 순수한 껍데기(Empty Namespace)입니다. 별도의 Manifest로 정의하지 않는 한, 라벨이나 어노테이션(예: Istio injection, PSA)은 붙지 않습니다.
- 권한 요구: ArgoCD Controller의 ServiceAccount는 클러스터 수준에서
namespaces리소스에 대한create권한을 가지고 있어야 합니다.
비유 (Analogy)
- CreateNamespace=true: “택배(애플리케이션)를 주문하면, 택배 기사가 알아서 문 앞에 택배함(네임스페이스)을 놓고 물건을 넣어주는 서비스.”
- 위험성: 택배함에 잠금장치(보안 정책)가 없는 기본 박스만 놔두고 갈 수 있습니다.
실무적 함의 (Operational Implications)
- 권장 케이스 (Test/Ephemeral): 테스트 환경이나 수명이 짧은 프리뷰 환경에서는 관리 오버헤드를 줄이기 위해 적극 권장됩니다.
- 주의 케이스 (Production): 운영 환경에서는 네임스페이스에 ResourceQuota, NetworkPolicy, PodSecurityAdmission 라벨 등이 필수적인 경우가 많습니다. 따라서 Prod에서는 네임스페이스를 별도의 인프라용 ArgoCD Application으로 관리하거나, 사전에 프로비저닝하는 것이 안전합니다.
주의사항 / 오해 (Pitfalls & Misconceptions)
- Prune과의 관계:
CreateNamespace=true로 만들어진 네임스페이스는 ArgoCD Application이 삭제될 때 자동으로 삭제되지 않는 경우가 많습니다(Managed Resource 목록에 명시적으로 포함되지 않음). 완전한 생명주기 관리를 원한다면 네임스페이스 자체를 YAML로 정의하여 Git에 포함시켜야 합니다.
References
- Argo CD Docs: Sync Options