🎉 DevOps Interview Prep Bundle is live — 1000+ Q&A across 20 topicsGet it →
All Articles

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.

DevOpsBoysMay 25, 20265 min read
Share:Tweet

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 Application manifests
  • 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.

bash
# Check parent app status
argocd app get app-of-apps
 
# Look for differences
argocd app diff app-of-apps

Common output:

===== apps/ ======
spec:
  source:
    targetRevision: HEAD   ← in git
    targetRevision: ""     ← in cluster (empty string ≠ "HEAD")

Fix — use server-side-apply or replace sync option:

yaml
# 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 noise

Or accept the diff with ignoreDifferences:

yaml
spec:
  ignoreDifferences:
  - group: argoproj.io
    kind: Application
    jsonPointers:
    - /spec/source/targetRevision
    - /spec/project

Symptom 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).

yaml
# 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.svc

If namespace: argocd is missing or wrong, the parent creates Application objects in the wrong namespace where ArgoCD doesn't watch.

bash
# Verify ArgoCD namespace
kubectl get pods -n argocd
 
# Check where Application objects are being created
kubectl get applications -A

Cause 2: Parent App Destination Doesn't Allow Creating CRDs

yaml
# 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 here

If 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

bash
# Check if ArgoCD can create Application objects
kubectl auth can-i create applications.argoproj.io \
  --as=system:serviceaccount:argocd:argocd-application-controller \
  -n argocd

If no — ArgoCD's service account lacks permission to create Application CRDs.

Fix:

yaml
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.

bash
# Check the project the child app belongs to
argocd app get frontend | grep Project
 
# Check project permissions
argocd proj get default

Fix — update the project to allow child app destinations:

yaml
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:

yaml
spec:
  destinations:
  - namespace: frontend
    server: https://kubernetes.default.svc
  - namespace: backend
    server: https://kubernetes.default.svc

Symptom 4: Sync Stuck — "Another operation is in progress"

bash
# 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-apps

This 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

yaml
# 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: HEAD

If repoURL doesn't exactly match what's registered in ArgoCD repositories (including trailing slashes, .git suffix), ArgoCD won't find it.

bash
# List registered repos
argocd repo list
 
# Verify exact URL format
argocd repo get https://github.com/myorg/myrepo

Debugging Checklist

bash
# 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 argocd

Working App of Apps Example

yaml
# 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
yaml
# 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=true

Related: 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

Browse fixes
Newsletter

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

Comments