Skip to content
Latchkey

Argo CD "Degraded" health status after sync in CI

An Application can be Synced and still Degraded: sync means the manifests matched Git, health means the running workload is actually up. Degraded means a Deployment, rollout, or other resource failed its own health assessment.

What this error means

Sync succeeds but argocd app get shows Health Status: Degraded, and a CI argocd app wait --health fails or times out. The degraded resource usually has crash-looping or unschedulable pods.

argocd
Name:            my-app
Sync Status:     Synced to HEAD (a1b2c3d)
Health Status:   Degraded
GROUP  KIND        NAME  STATUS  HEALTH     MESSAGE
apps   Deployment  api   Synced  Degraded   Deployment "api" exceeded its
progress deadline

Common causes

Pods crash or fail to start

A Deployment is Degraded when its pods crash-loop, fail readiness, or the rollout exceeds its progress deadline, so the desired replicas never become available.

A resource cannot schedule

Missing image, insufficient resources, or an unbound PVC keeps pods Pending, which the health check reports as Degraded.

How to fix it

Inspect the degraded resource directly

  1. Run argocd app get <app> and read the MESSAGE on the Degraded resource.
  2. Describe the workload and its pods in the cluster to see events.
  3. Fix the root cause (image, resources, config) and re-sync.
Terminal
argocd app get my-app
kubectl -n prod describe deployment api
kubectl -n prod get pods -l app=api

Wait on health explicitly in CI

Gate the pipeline on the actual health check so a Degraded rollout fails the deploy job rather than passing silently.

.github/workflows/deploy.yml
- run: argocd app wait my-app --health --timeout 300

How to prevent it

  • Wait on --health, not just --sync, in the deploy job.
  • Set realistic readiness probes and progress deadlines.
  • Verify image tags and resource requests before promoting to prod.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →