Skip to content

Troubleshooting

Symptom → fix, in the order you'll hit them.

App stuck "Progressing" forever

Symptom: sync starts, resources show Progressing, never become Healthy.

Cause: usually the workload itself — image pull failing, CrashLoopBackOff, a service with no endpoints.

Fix: this isn't an Argo CD problem; it's Argo CD faithfully reporting a broken app. kubectl -n <ns> get pods and read the pod events. Fix the app; Argo CD will notice.

Everything is OutOfSync right after syncing

Symptom: you sync, it goes green, seconds later it's OutOfSync again with no new commits.

Cause: the live object has fields the git manifests don't — typically status fields, auto-generated values, or defaults the API server injects.

Fix: tell Argo CD to ignore those fields with ignoreDifferences on the Application:

spec:
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas

(/spec/replicas is the classic: an HPA manages replicas, git says 3, they fight forever. Ignoring the field ends the war.)

"Permission denied" on sync

Symptom: sync fails; events mention RBAC or project restrictions.

Cause: the app's repo or destination isn't allowed by its AppProject, or the Argo CD service account lacks cluster permissions.

Fix: check the project's sourceRepos and destinations first — a typo'd repo URL is the usual suspect. Then check whether the destination namespace exists (or enable CreateNamespace=true).

Can't reach private repos

Symptom: app shows "unable to clone" or authentication errors.

Cause: Argo CD has no credentials for the repo.

Fix: UI → Settings → Repositories → Connect Repo, or argocd repo add from the CLI. For private repos you need a deploy key or token before the app will ever go green — Argo CD can't prompt you mid-sync.

Webhook never fires (polling feels slow)

Symptom: commits take ~3 minutes to show up.

Cause: that's the default poll interval — not a bug.

Fix: it resolves on its own, or configure a webhook from your git host to Argo CD for near-instant updates. Don't lower the poll interval to seconds; you'll hammer your git host for nothing.

Self-heal reverted my emergency fix

Symptom: a hand-applied hotfix during an incident vanished minutes later.

Cause: selfHeal: true doing exactly what it was told.

Fix: commit the hotfix to git (the right answer — now it's reviewed and permanent), or temporarily pause the app (argocd app suspend) while you fight the fire. Afterward, decide whether that app should really be self-healing — incident-prone apps sometimes shouldn't.

The UI shows apps I deleted

Symptom: deleted Application CRs linger as ghosts.

Cause: the app-of-apps parent still lists them, or finalizers are stuck.

Fix: remove them from the parent's repo first (the parent will prune them if configured). For stuck finalizers, kubectl patch the Application to remove the finalizer — carefully, understanding you're bypassing the safety catch.