ArgoCD App of Apps Not Syncing — Every Fix (2026)
Your ArgoCD App of Apps pattern stopped syncing. Child apps aren't created, parent shows OutOfSync, or sync is stuck. Here are every cause and the exact fix.
The App of Apps pattern in ArgoCD is powerful for managing multiple applications, but when it breaks, diagnosing it is non-obvious. The parent app, child apps, and underlying manifests all have separate sync states — and the error messages aren't always helpful.
Here's every cause and fix.
How App of Apps Works (Quick Recap)
The App of Apps pattern has:
- A parent app that points to a directory of ArgoCD
Applicationmanifests - Child apps that get created by the parent when it syncs
- Each child app manages its own workload
Git repo/
└── apps/
├── app-of-apps.yaml ← Parent Application (you create this manually)
├── frontend-app.yaml ← Child Application manifest
├── backend-app.yaml ← Child Application manifest
└── database-app.yaml ← Child Application manifest
When the parent syncs, it applies the child Application manifests into the cluster. ArgoCD then picks up and manages those child apps.
Symptom 1: Parent App Shows OutOfSync but Won't Sync
Cause: Sync Policy Differences Between Parent and Children
The parent app syncs fine, but immediately shows OutOfSync because it's comparing the child Application objects in cluster against Git.
# Check parent app status
argocd app get app-of-apps
# Look for differences
argocd app diff app-of-appsCommon output:
===== apps/ ======
spec:
source:
targetRevision: HEAD ← in git
targetRevision: "" ← in cluster (empty string ≠ "HEAD")
Fix — use server-side-apply or replace sync option:
# Parent app manifest
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app-of-apps
namespace: argocd
spec:
syncPolicy:
syncOptions:
- ServerSideApply=true # Avoids client-side apply diff noiseOr accept the diff with ignoreDifferences:
spec:
ignoreDifferences:
- group: argoproj.io
kind: Application
jsonPointers:
- /spec/source/targetRevision
- /spec/projectSymptom 2: Child Apps Not Being Created
The parent app syncs successfully (shows Synced) but no child Application objects appear in the cluster.
Cause 1: Wrong destination.namespace — ArgoCD not in that namespace
Child Application manifests must be created in the argocd namespace (or wherever ArgoCD is installed).
# child app yaml in git
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: frontend
namespace: argocd # MUST match ArgoCD's namespace
spec:
destination:
namespace: frontend # This is where the workload goes
server: https://kubernetes.default.svcIf namespace: argocd is missing or wrong, the parent creates Application objects in the wrong namespace where ArgoCD doesn't watch.
# Verify ArgoCD namespace
kubectl get pods -n argocd
# Check where Application objects are being created
kubectl get applications -ACause 2: Parent App Destination Doesn't Allow Creating CRDs
# Parent app destination must point to the cluster, NOT a specific namespace
spec:
destination:
server: https://kubernetes.default.svc
namespace: argocd # Parent creates Application objects hereIf you set namespace: "" (empty) or point to a wrong namespace, the Application manifests won't land where ArgoCD watches.
Cause 3: RBAC — ArgoCD Service Account Can't Create Applications
# Check if ArgoCD can create Application objects
kubectl auth can-i create applications.argoproj.io \
--as=system:serviceaccount:argocd:argocd-application-controller \
-n argocdIf no — ArgoCD's service account lacks permission to create Application CRDs.
Fix:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: argocd-application-controller
rules:
- apiGroups: ["argoproj.io"]
resources: ["applications"]
verbs: ["create", "get", "list", "watch", "update", "patch", "delete"]Symptom 3: Child Apps Created But Stuck in "Unknown" or Not Syncing
Cause: Project RBAC Restrictions
Each ArgoCD Application must belong to a project. If the child app's project doesn't allow the destination namespace or cluster, it won't sync.
# Check the project the child app belongs to
argocd app get frontend | grep Project
# Check project permissions
argocd proj get defaultFix — update the project to allow child app destinations:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: default
namespace: argocd
spec:
destinations:
- namespace: '*' # Allow any namespace
server: '*' # Allow any cluster
sourceRepos:
- '*' # Allow any repo
clusterResourceWhitelist:
- group: '*'
kind: '*'Or be more specific per team:
spec:
destinations:
- namespace: frontend
server: https://kubernetes.default.svc
- namespace: backend
server: https://kubernetes.default.svcSymptom 4: Sync Stuck — "Another operation is in progress"
# Check if a sync operation is stuck
argocd app get app-of-apps | grep Operation
# Terminate the stuck operation
argocd app terminate-op app-of-appsThis happens when a previous sync was interrupted. Terminating frees the lock.
Symptom 5: Parent App Synced But Child App Shows Wrong Git Repo
Cause: Relative vs Absolute Paths in Child App Manifests
# Child app in git — path issues
spec:
source:
repoURL: https://github.com/myorg/myrepo # Must be exact URL
path: services/frontend # Relative to repo root
targetRevision: HEADIf repoURL doesn't exactly match what's registered in ArgoCD repositories (including trailing slashes, .git suffix), ArgoCD won't find it.
# List registered repos
argocd repo list
# Verify exact URL format
argocd repo get https://github.com/myorg/myrepoDebugging Checklist
# 1. Check parent app sync status and errors
argocd app get app-of-apps
argocd app sync app-of-apps --dry-run
# 2. Check ArgoCD controller logs
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=100
# 3. Check repo server logs (git access issues)
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-repo-server --tail=100
# 4. Verify child apps exist
kubectl get applications -n argocd
# 5. Force refresh (in case of cache)
argocd app get app-of-apps --refresh
# 6. Check events on Application objects
kubectl describe application frontend -n argocdWorking App of Apps Example
# apps/app-of-apps.yaml (parent — apply this manually)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app-of-apps
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://github.com/myorg/k8s-apps
targetRevision: HEAD
path: apps/ # Directory containing child app manifests
destination:
server: https://kubernetes.default.svc
namespace: argocd # Child apps will be created here
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true# apps/frontend-app.yaml (child — managed by parent)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: frontend
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/k8s-apps
targetRevision: HEAD
path: services/frontend
destination:
server: https://kubernetes.default.svc
namespace: frontend
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=trueRelated: How to Set Up Argo Workflows CI/CD | Build GitOps Pipeline with Terraform, ArgoCD, GitHub Actions | ArgoCD vs Flux vs Jenkins GitOps Comparison
Today I Fixed
Short real fixes from production — posted daily
Stay ahead of the curve
Get the latest DevOps, Kubernetes, AWS, and AI/ML guides delivered straight to your inbox. No spam — just practical engineering content.
Related Articles
ArgoCD Image Updater Not Syncing — Fix Guide
ArgoCD Image Updater detects a new image tag but doesn't update the Application. Here's how to diagnose and fix annotation errors, registry auth issues, write-back problems, and sync failures.
ArgoCD Application Stuck OutOfSync or Progressing: Complete Fix Guide
ArgoCD app won't sync? Stuck in OutOfSync or Progressing state forever? Here's every cause and how to fix each one step by step.
ArgoCD vs Flux vs Jenkins — GitOps Comparison 2026
A deep-dive comparison of the three most popular GitOps and CI/CD tools — ArgoCD, Flux CD, and Jenkins. Learn which one fits your team, use case, and Kubernetes setup.