Cheveo Cheatsheet

ArgoCD Sync Failed & Degraded Cheatsheet

13 copy-paste commands. From diagnostic workflow through sync fixes and health debugging to webhooks, RBAC and CRDs, including common mistakes and quick decisions.

Read the article →

The workflow

1 Get
2 Operation
3 Inspect
4 Logs
5 Fix

Diagnostic workflow

1

The big picture

argocd app get <app-name>

→ Sync, operation and per-resource health at a glance. Shows which resource is the problem.

2

Sync error in plain text

argocd app get <app-name> --show-operation

→ Phase (Failed/Error) and the exact error message of the last sync operation.

3

Controller logs

kubectl logs -n argocd \
  -l app.kubernetes.io/name=argocd-application-controller \
  --tail=100

→ Apply errors, RBAC and timeouts that are not visible in the UI.

Fix Sync Failed

4

Validate the manifest

kubectl apply --dry-run=server -f manifest.yaml

→ Server-side dry-run uses the same validation as ArgoCD on the real apply.

5

Immutable field (Replace)

metadata:
  annotations:
    argocd.argoproj.io/sync-options: Replace=true

→ For fields that cannot change after creation (selector, clusterIP, volumeName).

6

Auto-create namespace

spec:
  syncPolicy:
    syncOptions:
      - CreateNamespace=true

→ Fixes "namespace not found" during sync.

7

Debug a hook job

kubectl get pods -n <namespace> -l job-name=<hook-job>
kubectl logs -n <namespace> job/<hook-job>

→ A PreSync/PostSync job with a non-zero exit aborts the sync. Check the job logs.

Fix Degraded

8

Crashed pods

kubectl get pods -n <namespace> -l app=<name>
kubectl logs -n <namespace> <pod> --previous

→ CrashLoopBackOff/ImagePullBackOff: logs of the previous, crashed container.

9

Probe failures

kubectl describe pod -n <namespace> <pod> | grep -A5 -i readiness
kubectl get events -n <namespace> | grep -i probe

→ Pods run but never go Ready: check path, port and initialDelaySeconds.

10

Service with no endpoints

kubectl get endpoints -n <namespace> <service>

→ Empty endpoints = the service selector matches no pod labels.

Webhooks, RBAC & CRDs

11

Find RBAC errors

kubectl logs -n argocd \
  -l app.kubernetes.io/name=argocd-application-controller \
  --tail=100 | grep -i forbidden

→ The controller lacks cluster permissions: extend the ClusterRole or whitelist in the project.

12

Admission webhook

kubectl get validatingwebhookconfigurations
kubectl describe constraint <name>   # Gatekeeper

→ Which webhook (OPA/Kyverno) rejects the apply. Also stated in the sync message.

13

Read CRD status

kubectl describe certificate -n <namespace> <name>

→ Built-in health checks: read the Certificate/Rollout status directly (Reason).

5 most common mistakes

Each one has cost us hours in production at least once.

1

Confusing "Synced" with "working"

Synced only means Git = cluster, not healthy. Health is a separate dimension.

2

Tweaking the sync on a Degraded app

Degraded is a health problem → kubectl describe/logs, not a re-sync

3

Deleting hook pods too early

hook-delete-policy: HookSucceeded keeps failed hook pods for analysis

4

Ignoring sync wave order

ArgoCD works strictly ascending: fix the earliest failing wave first

5

CRD without a custom health check

Without a Lua check in argocd-cm, ArgoCD treats custom CRDs as Unknown

Quick decisions

Synced + Degraded
→ Health problem → argocd app get
admission webhook denied
→ Satisfy policy (pattern 12)
field is immutable
→ Replace=true (pattern 5)
exceeded progress deadline
→ Check pods (pattern 8)
forbidden
→ Extend RBAC (pattern 11)
2-Day Hands-on Workshop

GitOps with ArgoCD - from push to production deploy

From the App-of-Apps pattern to progressive delivery: everything you need for GitOps in production.

View workshop details