Sync Waves: ordering complex deployments
A complex application deployment can have dependencies: the database must be available before the API starts, the API must be available before the worker starts, migrations must complete before new code starts serving traffic. Sync Waves let you define the creation order of resources within an ArgoCD Application.
# Wave 0: CRDs and namespaces — always first
apiVersion: v1
kind: Namespace
metadata:
name: production
annotations:
argocd.argoproj.io/sync-wave: "0"
---
# Wave 1: ConfigMaps and Secrets — before Deployments
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
annotations:
argocd.argoproj.io/sync-wave: "1"
---
# Wave 2: Deployments and StatefulSets
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
annotations:
argocd.argoproj.io/sync-wave: "2"
---
# Wave 3: Ingress — after services are ready
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
argocd.argoproj.io/sync-wave: "3"Resource Hooks: pre and post-sync operations
# PreSync hook — run migrations before deployment
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
template:
spec:
restartPolicy: Never
containers:
- name: migrate
image: company/api:latest
command: ["npm", "run", "db:migrate"]ApplicationSets: managing multiple clusters and environments
# ApplicationSet — deploy same service across multiple clusters
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: api-all-clusters
namespace: argocd
spec:
generators:
- matrix:
generators:
- clusters:
selector:
matchLabels:
region: latam
- list:
elements:
- env: staging
- env: production
template:
metadata:
name: 'api-{{name}}-{{env}}'
spec:
source:
path: 'apps/api/{{env}}'
destination:
server: '{{server}}'
namespace: '{{env}}'External Secrets Operator: the right secrets pattern
# ExternalSecret — sync from AWS Secrets Manager
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-credentials
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target:
name: db-credentials
data:
- secretKey: DATABASE_URL
remoteRef:
key: prod/api/database
property: urlCustom diff: ignoring runtime-changed fields
spec:
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas # ignore replicas managed by HPAFrequently Asked Questions
How many Applications can ArgoCD manage before performance degrades?
How do I manage ArgoCD RBAC so each team only sees their applications?
What happens with stateful applications (databases) in ArgoCD?
How do I implement automatic rollback if a PostSync hook fails?
Is ArgoCD Image Updater necessary, or is it better to update images from the CI pipeline?
Does your team want to implement advanced deployment patterns with ArgoCD in production? We have experience operating ArgoCD in enterprise clusters.
Talk to our team