Argo CD Cheat Sheet
GitOps Continuous Delivery für Kubernetes.
Konzepte
Application → beschreibt SOLL-Zustand (Git-Repo → Cluster)
AppProject → Gruppierung + Berechtigungen für Applications
Sync → Git-Zustand auf Cluster anwenden
Health → Status der deployen Ressourcen
Refresh → Git-Repo auf Änderungen prüfen
argocd CLI
# Login
argocd login argocd.example.com # interaktiv
argocd login argocd.example.com \
--username admin --password secret # non-interaktiv
argocd login argocd.example.com \
--sso # SSO/OAuth
# Kontext
argocd context # aktueller Server
argocd account get-user-info # eingeloggter User
Application verwalten
# Erstellen
argocd app create my-app \
--repo https://github.com/user/repo.git \
--path k8s/overlays/prod \
--dest-server https://kubernetes.default.svc \
--dest-namespace my-ns \
--sync-policy automated \
--auto-prune \
--self-heal
# Anzeigen
argocd app list
argocd app get my-app # Details + Sync-Status
argocd app get my-app --refresh # Git refreshen + Status
# Sync
argocd app sync my-app # manueller Sync
argocd app sync my-app --prune # gelöschte Ressourcen entfernen
argocd app sync my-app --force # Force-Sync
argocd app sync my-app \
--resource apps/Deployment/my-deploy # einzelne Ressource syncen
# Diff
argocd app diff my-app # Unterschiede Git ↔ Cluster
# Rollback
argocd app rollback my-app <revision>
argocd app history my-app # Sync-Historie
# Löschen
argocd app delete my-app # App + Ressourcen
argocd app delete my-app --cascade=false # nur App, Ressourcen bleiben
Application YAML
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd # ArgoCD Namespace
finalizers:
- resources-finalizer.argocd.argoproj.io # Ressourcen bei App-Delete löschen
spec:
project: default
source:
repoURL: https://github.com/user/repo.git
targetRevision: main # Branch, Tag oder HEAD
path: k8s/overlays/prod # Pfad zu Manifests
# Kustomize
kustomize:
images:
- my-app=registry.io/my-app:v1.2.3
# Helm
# helm:
# releaseName: my-app
# valueFiles:
# - values-prod.yaml
# values: |
# replicas: 3
# parameters:
# - name: image.tag
# value: "v1.2.3"
destination:
server: https://kubernetes.default.svc # In-Cluster
namespace: my-namespace
syncPolicy:
automated:
prune: true # gelöschte Ressourcen entfernen
selfHeal: true # manuelle Drift korrigieren
allowEmpty: false # Schutz vor leerem Repo
syncOptions:
- CreateNamespace=true # NS automatisch erstellen
- PruneLast=true # erst deployen, dann prunen
- ApplyOutOfSyncOnly=true # nur geänderte Ressourcen
- ServerSideApply=true # Server-Side Apply
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 1m
ignoreDifferences: # Felder ignorieren
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas # z.B. wenn HPA skaliert
ApplicationSet
Generiert mehrere Applications aus einer Vorlage.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-apps
namespace: argocd
spec:
generators:
# Liste
- list:
elements:
- cluster: dev
url: https://dev-cluster.example.com
namespace: my-app-dev
- cluster: prod
url: https://prod-cluster.example.com
namespace: my-app-prod
# Git-Verzeichnisse (ein App pro Verzeichnis)
# - git:
# repoURL: https://github.com/user/repo.git
# revision: main
# directories:
# - path: apps/*
# Cluster Generator (alle registrierten Cluster)
# - clusters:
# selector:
# matchLabels:
# env: production
template:
metadata:
name: 'my-app-{{cluster}}'
spec:
project: default
source:
repoURL: https://github.com/user/repo.git
targetRevision: main
path: 'k8s/overlays/{{cluster}}'
destination:
server: '{{url}}'
namespace: '{{namespace}}'
syncPolicy:
automated:
prune: true
selfHeal: true
AppProject
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: my-team
namespace: argocd
spec:
description: "Projekt für Team A"
sourceRepos:
- https://github.com/my-org/* # erlaubte Repos
destinations:
- server: https://kubernetes.default.svc
namespace: 'team-a-*' # erlaubte Namespaces
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceWhitelist:
- group: '*'
kind: '*'
roles:
- name: developer
policies:
- p, proj:my-team:developer, applications, sync, my-team/*, allow
- p, proj:my-team:developer, applications, get, my-team/*, allow
groups:
- my-team-devs # OIDC Group
Sync Waves & Hooks
# Sync-Reihenfolge steuern (niedrigere Welle zuerst)
metadata:
annotations:
argocd.argoproj.io/sync-wave: "-1" # vor Standard (0)
# Typische Reihenfolge:
# -2 Namespace, RBAC
# -1 ConfigMaps, Secrets
# 0 Deployments, Services (default)
# 1 Ingress, Routes
# 2 Post-Deploy Jobs
---
# Sync Hooks (Jobs die bei bestimmten Events laufen)
metadata:
annotations:
argocd.argoproj.io/hook: PreSync # vor dem Sync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
# Hook-Typen:
# PreSync → vor dem Sync (z.B. DB-Migration)
# Sync → während des Syncs
# PostSync → nach erfolgreichem Sync (z.B. Tests, Notification)
# SyncFail → bei fehlgeschlagenem Sync
Notifications
# ConfigMap für Notification Templates
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
trigger.on-sync-succeeded: |
- when: app.status.operationState.phase in ['Succeeded']
send: [slack-message]
template.slack-message: |
message: |
App {{.app.metadata.name}} synced successfully!
Revision: {{.app.status.sync.revision}}
service.slack: |
token: $slack-token
Status & Troubleshooting
# App-Status
argocd app get my-app
# Sync Status: Synced / OutOfSync
# Health: Healthy / Degraded / Progressing / Missing
# Detaillierte Ressourcen
argocd app resources my-app
argocd app manifests my-app # gerenderte Manifests
# Logs der managed Pods
argocd app logs my-app
# ArgoCD Server Logs
kubectl logs -n argocd deploy/argocd-server
kubectl logs -n argocd deploy/argocd-repo-server
kubectl logs -n argocd deploy/argocd-application-controller
# Hard Refresh (Cache leeren)
argocd app get my-app --hard-refresh
Quick Reference
Aktion CLI UI
───────────────────────── ──────────────────────────────── ────────
App erstellen argocd app create ... + New App
Sync auslösen argocd app sync my-app Sync Button
Diff anzeigen argocd app diff my-app App Detail
Rollback argocd app rollback my-app REV History Tab
Status prüfen argocd app get my-app Dashboard
Repo hinzufügen argocd repo add URL Settings
Cluster hinzufügen argocd cluster add CONTEXT Settings