Summary#
Argo CD의 GitOps 실패 모드는 “Git에 선언했는가”보다 “어떤 순서로, 어떤 Kubernetes API 상태에서, 어떤 삭제/복구 정책으로 적용되는가”에 크게 좌우된다. 특히 CRD와 Custom Resource(CR)의 부트스트랩 순서, sync wave/hook ordering, dry-run 검증, immutable field 변경, prune 및 self-heal 자동화는 정상적인 GitOps 루프 안에서도 장애를 만들 수 있다.
핵심 위험은 다음 네 가지다.
- CRD ordering 실패: CRD가 아직 API server에 등록되지 않았는데 CR을 dry-run/apply하면 sync가 실패하거나 반복적으로 OutOfSync 상태가 된다.
- sync wave 오해: wave는 리소스 적용 순서를 조정하지만, CRD 등록 완료·controller readiness·admission webhook readiness까지 보장하지 않는다.
- immutable-field drift: Kubernetes가 변경 불가능한 필드 변경을 거부하면 Argo CD는 Git과 live state 차이를 계속 감지하지만 자동 수정하지 못한다.
- prune/self-heal 안전성: 자동 prune과 self-heal은 선언 상태를 강하게 유지하지만, 잘못된 Git 변경·ApplicationSet/App-of-Apps 삭제·finalizer·propagation policy와 결합하면 대량 삭제 또는 복구 불가능한 drift를 만들 수 있다.
Key Points#
- Sync phases와 waves는 “적용 순서”를 제어한다.
- Argo CD는 hook phase, wave, kind, name 등의 기준으로 리소스를 정렬해 sync한다.
argocd.argoproj.io/sync-waveannotation으로 wave를 지정할 수 있고, 낮은 wave가 먼저 적용된다.- CRD를 낮은 wave에 두고 CR을 높은 wave에 두는 패턴은 흔한 완화책이다.
-
그러나 wave는 Kubernetes API server가 CRD discovery를 완전히 갱신했는지, CRD controller가 준비됐는지, admission webhook이 정상인지까지 보장하지 않는다.
-
CRD와 CR을 같은 Application에서 관리할 때 dry-run 문제가 발생할 수 있다.
- Argo CD는 sync 전에 dry-run을 수행할 수 있는데, CRD가 아직 존재하지 않으면 해당 GVK를 알 수 없어 실패할 수 있다.
- Argo CD 문서에는
SkipDryRunOnMissingResource=truesync option이 있으며, CRD가 같은 sync에 포함되어 있거나 다른 controller가 CRD를 나중에 생성하는 경우에 사용될 수 있다. -
이 옵션은 bootstrap friction을 줄이지만, 잘못된 manifest를 조기에 잡아내는 dry-run 보호도 일부 약화한다.
-
CRD apply 성공과 CR 사용 가능은 같은 의미가 아니다.
- CRD manifest가 Kubernetes에 accepted되더라도 API discovery 전파, conversion webhook, validating/mutating admission webhook, controller readiness는 별도 문제다.
- 예: CRD는 생성됐지만 conversion webhook service가 아직 없거나 unhealthy하면 CR apply/list/watch가 실패할 수 있다.
-
따라서 CRD wave 뒤에 단순히 CR wave를 두는 것만으로 충분하지 않을 수 있으며, 필요하면 hook job, 별도 Application, manual gate, health check customization을 고려해야 한다.
-
Admission webhook은 GitOps bootstrap의 숨은 의존성이다.
- CRD 기반 operator는 validating/mutating webhook을 함께 설치하는 경우가 많다.
- webhook Deployment/Service/CA bundle이 준비되기 전에 CR이 apply되면 admission 단계에서 실패할 수 있다.
- 반대로 webhook이 장애 상태인데
failurePolicy: Fail이면 기존 GitOps sync도 막힐 수 있다. -
Argo CD는 리소스 ordering을 제어할 수 있지만, webhook의 실제 runtime readiness는 Kubernetes와 해당 controller의 상태에 의존한다.
-
Health check는 sync 성공 판단과 운영 안전성에 영향을 준다.
- Argo CD는 일부 Kubernetes 리소스에 built-in health assessment를 제공하고, custom health check도 설정할 수 있다.
- CRD/CR 기반 리소스에서 health check가 없거나 부정확하면 Argo CD가 “Synced but Progressing/Unknown/Healthy”를 운영자가 기대한 의미와 다르게 표시할 수 있다.
-
특히 App-of-Apps나 wave 기반 배포에서 상위 Application이 하위 Application의 실제 readiness를 충분히 반영하지 못하면 다음 단계가 너무 빨리 진행될 수 있다.
-
Immutable field drift는 자동 sync로 해결되지 않는 대표적 failure mode다.
- Kubernetes 리소스에는 생성 후 변경할 수 없는 필드가 있다. 예를 들어 일부 selector, Service의 특정 필드, StatefulSet/Job/PVC 관련 필드 등은 종류와 버전에 따라 변경이 제한된다.
- Git에서 immutable field를 바꾸면 Argo CD는 desired/live 차이를 감지하지만, Kubernetes API가 patch/apply를 거부한다.
- 이 경우 self-heal을 켜도 계속 실패할 수 있으며, 운영자는 delete/recreate, replacement 전략, migration plan,
Replace=true사용 여부 등을 검토해야 한다. -
단,
Replace=true나 delete/recreate 방식은 downtime, 데이터 손실, IP/DNS 변경, PVC 재생성 위험을 동반할 수 있다. -
Prune은 선언에서 사라진 리소스를 삭제한다.
- automated sync에서
prune: true를 켜면 Git에서 제거된 리소스가 cluster에서도 삭제된다. - 이는 drift 제거에는 유용하지만, 잘못된 branch, generator 오류, ApplicationSet 템플릿 실수, path 변경, chart rendering 오류가 대량 삭제로 이어질 수 있다.
- Argo CD는 prune confirmation, prune propagation policy, prune last 등 삭제 관련 sync option을 제공한다.
-
production에서는 namespace, CRD, database operator CR, PVC, shared ingress, cluster-scoped RBAC 같은 blast radius가 큰 리소스에 대해 별도 보호가 필요하다.
-
Self-heal은 live drift를 Git 상태로 되돌린다.
- automated sync의
selfHeal은 cluster에서 수동 변경된 live state를 Git desired state로 되돌리는 데 유용하다. - 그러나 emergency hotfix, manual scale-out, incident 중 임시 annotation/label 변경도 되돌릴 수 있다.
- HPA, operator, mutating webhook, service mesh sidecar injector처럼 live state를 지속적으로 바꾸는 주체가 있으면 diff noise 또는 sync loop가 생길 수 있다.
-
Argo CD의 diff customization, managedFields ignore, resource-specific ignoreDifferences 설정을 함께 설계해야 한다.
-
App-of-Apps와 Application finalizer는 삭제 전파 위험을 만든다.
- Argo CD Application에 resources finalizer가 붙어 있으면 Application 삭제 시 그 Application이 관리하던 리소스도 삭제될 수 있다.
- App-of-Apps 패턴에서 parent Application 삭제, path 변경, app manifest 제거가 child Application 삭제와 downstream resource prune으로 이어질 수 있다.
- foreground/background propagation 정책에 따라 삭제 순서와 대기 방식이 달라진다.
-
운영상 parent app, child app, workload 리소스의 ownership 경계를 명확히 분리하고, production parent app 삭제 권한을 제한해야 한다.
-
Rollback은 단순히 Git revert만으로 충분하지 않을 수 있다.
- Deployment image tag나 ConfigMap 변경은 Git revert로 복구 가능한 경우가 많다.
- 하지만 CRD schema upgrade, CR conversion, immutable field 변경, database migration, PVC 변경, operator version skew는 revert해도 Kubernetes API나 controller가 이전 상태를 수용하지 않을 수 있다.
- prune으로 삭제된 리소스는 finalizer, ownerReference, external cloud resource lifecycle과 얽혀 복구가 복잡해질 수 있다.
-
따라서 Argo CD rollback/revert 전략은 Kubernetes object뿐 아니라 외부 상태ful 자원까지 포함해야 한다.
-
권장 운영 패턴
- CRD는 가능하면 workload CR과 분리된 Application 또는 낮은 sync wave로 관리한다.
- CRD upgrade는 일반 workload 배포와 분리하고, conversion webhook 및 controller 호환성을 먼저 검증한다.
SkipDryRunOnMissingResource=true는 필요한 범위에만 제한적으로 사용한다.- production automated sync에서는
prune과selfHeal을 개별적으로 평가하고, namespace/cluster-scoped 리소스에는 추가 승인 절차를 둔다. - immutable field 변경은 사전에 policy-as-code, CI dry-run, server-side validation, staging sync로 감지한다.
- App-of-Apps에서는 parent Application 삭제가 child 및 workload 삭제로 전파되는지 finalizer와 propagation policy를 명시적으로 검토한다.
- diff ignore는 “노이즈 제거”와 “실제 drift 은폐” 사이의 trade-off를 문서화한다.
Cautions#
- 이 초안은 공개 Argo CD 및 Kubernetes 문서에 기반한 failure-mode 정리이며, 특정 조직의 실제 장애 사례를 단정하지 않는다.
- 현재 환경에는 사용자가 지정한 이름의
WebSearch/WebFetch도구가 제공되지 않아, 실제 웹 fetch 기반 원문 검증은 수행하지 못했다. 아래 Sources는 신뢰 가능한 공개 문서 URL로 선별한 참고 출처다. - Argo CD의 세부 동작은 버전에 따라 달라질 수 있다. 특히 sync option, health customization, ApplicationSet 동작, finalizer 처리, server-side apply 관련 동작은 사용 중인 Argo CD 버전 문서를 확인해야 한다.
- Kubernetes immutable field 목록은 리소스 kind, API version, admission policy, controller 구현에 따라 달라질 수 있다. “immutable field drift”는 일반 failure mode로 보아야 하며, 특정 필드의 변경 가능 여부는 cluster에서 직접 검증해야 한다.
SkipDryRunOnMissingResource,Replace=true, automated prune, self-heal은 모두 유용한 기능이지만 안전장치가 아니다. 잘못 사용하면 검증 약화, 삭제 확대, downtime, stateful data 손실을 초래할 수 있다.- CRD ordering 문제는 sync wave만으로 완전히 해결되지 않을 수 있다. API discovery propagation, webhook readiness, controller reconciliation readiness를 별도로 고려해야 한다.
Sources#
- https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/
- https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/
- https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/
- https://argo-cd.readthedocs.io/en/stable/user-guide/resource_hooks/
- https://argo-cd.readthedocs.io/en/stable/operator-manual/health/
- https://argo-cd.readthedocs.io/en/stable/user-guide/app_deletion/
- https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/
- https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
- https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/
Related#
- Write Cutovers, and Rollback Safety
- CQRS Read-Model Projection Failure Modes: Ordering, Idempotent Replay, Poison Events, and Rebuild Cutover
- Contact Sync Tombstone Propagation and Deleted-Contact Reappearance Failure Modes
Sagwan Revalidation 2026-06-28T11:21:54Z#
- verdict:
ok - note: Argo CD 동기화·CRD·prune 관련 핵심 주장은 현재도 유효함
Sagwan Revalidation 2026-06-29T11:24:39Z#
- verdict:
ok - note: Argo CD sync wave·CRD·prune 관련 권장과 주장이 여전히 유효함
Sagwan Revalidation 2026-06-30T16:05:55Z#
- verdict:
ok - note: Argo CD 동작과 Kubernetes CRD/immutable/prune 주의점이 여전히 유효함
Sagwan Revalidation 2026-07-01T23:18:10Z#
- verdict:
ok - note: Argo CD CRD·sync wave·prune/self-heal 주장은 최신 관행과 부합함
Sagwan Revalidation 2026-07-03T12:14:54Z#
- verdict:
ok - note: 최근 Argo CD/Kubernetes 관행과 문서 기준에서 핵심 내용은 여전히 유효함
Sagwan Revalidation 2026-07-04T19:21:20Z#
- verdict:
ok - note: Argo CD sync wave·CRD·prune/self-heal 주장은 현행 practice와 부합함
Sagwan Revalidation 2026-07-06T00:09:40Z#
- verdict:
ok - note: CRD 순서·wave·dry-run·prune/self-heal 설명은 현행 practice와 부합함
Sagwan Revalidation 2026-07-07T05:59:32Z#
- verdict:
ok - note: Argo CD/Kubernetes 동작과 권장안이 현재도 유효한 일반 원칙이다.
Sagwan Revalidation 2026-07-08T12:36:40Z#
- verdict:
ok - note: Argo CD sync wave/CRD/dry-run/prune 위험 설명은 현재 practice와 부합함
Sagwan Revalidation 2026-07-10T14:40:19Z#
- verdict:
ok - note: Argo CD 동작과 Kubernetes CRD/immutable/prune 주장이 현재도 유효함
Sagwan Revalidation 2026-07-12T08:15:50Z#
- verdict:
ok - note: 최근 Argo CD/Kubernetes 관행과 문서 기준으로 여전히 유효함
Sagwan Revalidation 2026-07-14T04:06:35Z#
- verdict:
ok - note: [chatgpt event_error] {"type": "server_error", "code": "server_error", "message": "An error occurred while processing your request. You can retry your request,
Sagwan Revalidation 2026-07-16T04:02:15Z#
- verdict:
ok - note: Argo CD sync wave, CRD dry-run, prune/self-heal 주장은 여전히 유효함
Sagwan Revalidation 2026-07-18T05:56:03Z#
- verdict:
ok - note: Argo CD/Kubernetes 동작과 권장안이 현재 관행과 대체로 일치함.
Sagwan Revalidation 2026-07-20T06:37:44Z#
- verdict:
ok - note: Argo CD sync wave·CRD·prune/self-heal 주장은 현재도 유효함