11 KiB
Executable File
Hier ist eine umfassende Einführung in Argo CD – verständlich, aber fachlich fundiert.
1. Was ist Argo CD?
Argo CD ist ein GitOps-Tool für Kubernetes. Es sorgt dafür, dass der Zustand eines Kubernetes-Clusters immer mit dem übereinstimmt, was in einem Git-Repository als „Wahrheit“ definiert ist.
Kerneigenschaften:
- Git-zentriert: Git als Single Source of Truth (Manifest-Dateien, Helm-Charts, Kustomize, etc.)
- Deklarativ: Der gewünschte Zustand (desired state) ist beschrieben, nicht programmiert
- Kontinuierliche Synchronisierung: Änderungen in Git werden automatisch oder manuell im Cluster ausgerollt
- Visuell: Web UI mit Übersicht über Applikationen, Health-Status, Diffs, History
- Mehrcluster-fähig: Kann mehrere Kubernetes-Cluster verwalten
2. GitOps – der Kontext von Argo CD
Argo CD implementiert das GitOps-Konzept:
- Infrastruktur & Deployments im Git (Manifest-Dateien, Helm Values, Kustomize Overlays, etc.)
- Pull-basiert: Argo CD „zieht“ den Zustand regelmäßig aus Git und gleicht ihn mit dem Cluster ab.
- Versioniert & auditiert: Jede Änderung ist ein Git-Commit, inkl. History, Review, Rollback-Möglichkeit
- Automatisierte Drift-Erkennung: Unterschiede zwischen Git und Cluster werden erkannt und gemeldet
Vorteile von GitOps mit Argo CD:
- Reproduzierbare Deployments
- Besseres Change-Management (Git-Workflows, PRs)
- Weniger manuelle „kubectl apply“-Befehle
- Klare Trennung von Build (CI) und Deployment (CD)
3. Architektur von Argo CD
3.1 Hauptkomponenten
-
argocd-server
- Stellt die Web UI und das gRPC/REST-API bereit
- Authentifizierung (lokale User, SSO via OIDC, etc.)
- Kommunikation mit CLI (
argocdCLI) und UI
-
argocd-repo-server
- Greift auf Git-Repositories zu
- Rendert Manifeste (z.B. Helm, Kustomize, Jsonnet)
- Führt Template-Engines und „Config Management Plugins“ aus
-
argocd-application-controller
- Herzstück des Sync-Mechanismus
- Vergleicht desired state (Git) mit live state (Cluster)
- Führt Syncs, Health-Checks und Rollbacks aus
-
argocd-redis (optional, in vielen Installationen vorhanden)
- Cache für Repositories und Application-Informationen
Diese Komponenten laufen typischerweise im Namespace argocd im Cluster.
3.2 Target Cluster
Argo CD kann:
- Den Cluster, in dem es selbst läuft, verwalten
- Externe Cluster (z.B. Staging, Prod) als zusätzliche „Cluster Secrets“ anbinden
4. Zentrale Konzepte
4.1 Application
Die zentrale Ressource in Argo CD ist eine CRD namens Application (kind: Application).
Eine Application beschreibt:
- Quelle (source): Woher kommen die Manifeste?
- Git-Repository / Helm-Repo / Kustomize-Ordner
- Pfad im Repo
- ggf. Helm-Chart und Values
- Ziel (destination):
- Zu verwaltender Kubernetes-Cluster
- Ziel-Namespace
- Sync-Strategie & -Optionen:
- Automatische Synchronisierung (auto sync) oder manuell
- Verhalten bei Fehlern, Prune, Self-Heal etc.
Ein minimaler Application-Beispiel (vereinfachtes YAML):
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/mein-org/mein-repo.git
targetRevision: main
path: kubernetes/my-app
destination:
server: https://kubernetes.default.svc
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
4.2 Sync-Status & Health-Status
Für jede Application zeigt Argo CD zwei wesentliche Zustände:
- Sync-Status:
Synced: Cluster-Zustand entspricht Git-ZustandOutOfSync: Unterschiede zwischen Git und Cluster
- Health-Status:
Healthy: Anwendung läuft wie erwartet (z.B. alle Pods bereit)Degraded: Fehlerzustände (CrashLoop, fehlende Ressourcen etc.)Progressing: Deployment läuft noch, noch nicht stabil
Health-Checks sind ressourcentyp-spezifisch (Deployments, StatefulSets, CRDs etc.).
4.3 Drift-Erkennung
Argo CD vergleicht:
- Desired state: Manifeste, die aus Git gerendert wurden
- Live state: Tatsächliche Ressourcen im Cluster
Wenn jemand manuell kubectl apply oder kubectl edit verwendet, entsteht „Drift“. Argo CD:
- Markiert den Status als
OutOfSync - Kann bei
selfHeal: truediese Änderungen automatisch wieder rückgängig machen (zurück auf Git-Zustand)
5. Unterstützte Werkzeuge & Formate
Argo CD unterstützt u.a.:
- Plain YAML-Manifeste
- Helm (Charts, Values)
- Kustomize
- Jsonnet
- Ksonnet (legacy)
Außerdem:
- Config Management Plugins (CMP): Eigene Tools/Pipelines zum Manifest-Rendering integrierbar
- Multiple Sources: Neuere Versionen unterstützen mehrere Quellen pro Application (z.B. App-Manifeste + separate Helm-Values)
6. Installation & erste Schritte
6.1 Installation
Typische Wege:
- kubectl apply eines offiziellen Install-Manifests:
- z.B.
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
- z.B.
- Helm-Chart (empfohlen für produktivere Setups)
- Operator-Lösungen in manchen Distributionen
Nach der Installation:
- Argo CD läuft im Namespace
argocd - UI via
argocd-server(LoadBalancer, Ingress oder Port-Forward) - Erstlogin meist über das Passwort aus dem
argocd-initial-admin-secret
6.2 CLI
Das CLI-Tool argocd erlaubt:
- Login:
argocd login <server> - Erstellung von Applications:
argocd app create ... - Manuelles Syncen:
argocd app sync my-app - Status anzeigen, Diffs, Rollbacks etc.
7. Deployment-Strategien & Sync-Policies
7.1 Manuelles vs. automatisches Syncen
- Manuell:
- Änderungen in Git werden erkannt, aber nur als
OutOfSyncmarkiert - Deploy erfolgt erst nach
argocd app sync(CLI/UI)
- Änderungen in Git werden erkannt, aber nur als
- Automatisch (auto sync):
- Argo CD führt bei Änderungen in Git automatisch ein Sync aus
- Option
pruneentfernt Ressourcen, die in Git gelöscht wurden - Option
selfHealkorrigiert Drift im Cluster
7.2 Sync-Optionen
- Sync-Wellen (Sync Waves):
- Steuerung der Reihenfolge via
argocd.argoproj.io/sync-waveAnnotation
- Steuerung der Reihenfolge via
- Sync-Hooks:
- Vor-/Nachschaltbare Hooks (
PreSync,PostSync,SyncFailetc.) - Realisiert mit bestimmten Kubernetes-Resourcen und Annotationen
- Vor-/Nachschaltbare Hooks (
8. Projekte (AppProjects) & Multi-Tenancy
Die CRD AppProject erlaubt die logische Gruppierung und Begrenzung von Applications.
Funktionen von AppProjects:
- Einschränkung von:
- Erlaubten Git-Repositories
- Erlaubten Ziel-Cluster / Namespaces
- Erlaubten Ressourcentypen
- Gemeinsame Policies & RBAC für eine Gruppe von Apps
- Sinnvoll für Multi-Tenancy:
- z.B. ein Project pro Team, Produkt oder Mandant
9. Sicherheit & RBAC
9.1 Authentifizierung
- Lokale Benutzer in Argo CD (Admin, weitere User)
- Single Sign-On via:
- OIDC (z.B. Keycloak, Dex, Azure AD, Okta)
- SAML (über OIDC-Integrationen)
- Tokens für Automatisierung (CI-Systeme, Bots)
9.2 Autorisierung (RBAC)
Argo CD hat ein eigenes RBAC-System:
- Rollen (z.B.
role:readonly,role:admin, benutzerdefinierte Rollen) - Zuordnung von Rollen zu Subjekten (User, Gruppen)
- Rechte auf:
- Anwendungen (lesen, syncen, löschen)
- Projekte
- Cluster, Repos
- Granulare Steuerung:
- z.B. „Team A darf nur Apps in Project X syncen“
10. Typische Patterns: App-of-Apps & Monorepo/Multirepo
10.1 App-of-Apps Pattern
Ein häufiges Muster ist die „Application of Applications“:
- Eine „Root-Application“, deren Manifeste nur aus anderen
Application-Ressourcen bestehen - Diese Root-App definiert alle anderen Applikationen/Umgebungen
- Vorteile:
- Zentrales Entry-Point
- Environments (dev/stage/prod) als Under-Apps
- Bessere Struktur bei vielen Services
10.2 Repository-Strukturen
- Monorepo:
- Alle Manifeste aller Services und Environments in einem Git-Repo
- Multirepo:
- Pro Service oder Team ein eigenes Repo
- Infrastruktur/Plattform in separaten Repos
- Argo CD unterstützt beide Modelle – Entscheidung ist organisatorisch/architektonisch.
11. Integration in CI/CD-Pipelines
Argo CD übernimmt in einem klassischen Setup die CD-Rolle:
- CI-Pipeline (z.B. GitLab CI, GitHub Actions, Jenkins):
- Buildet Container-Images
- Pusht Images in ein Registry
- Aktualisiert Versionsnummern/Tags in den Git-Manifesten (Deployment-Repo)
- Argo CD:
- Erkennt Änderungen im Git-Repo
- Deployt diese in den Cluster
Dadurch entsteht eine klare Trennung:
- CI = Builds, Tests, Image-Erzeugung
- CD = Versionswechsel im Git + Argo CD Sync
12. Monitoring & Observability
- Argo CD bietet:
- Events & Logs (Application-Controller, Repo-Server etc.)
- Metriken (Prometheus-Exporter) für:
- Anzahl Apps, Sync-Status, Health
- Dauer von Syncs
- Fehler, Retries
- Integration mit:
- Prometheus/Grafana (Dashboards für Argo CD)
- Alerting auf Drift, Degradation, Sync-Fehler
13. Best Practices
Einige bewährte Vorgehensweisen:
- Git als einzige Wahrheit
- Keine manuellen Änderungen via
kubectlin produktiven Namespaces
- Keine manuellen Änderungen via
- Automatisches Syncen mit Self-Heal (mindestens in lower Environments)
- Trennung von Image-Build-Repo und Deployment-Repo
- AppProjects pro Team/Domain zur Strukturierung und Begrenzung
- RBAC sauber definieren:
- Admin-Rechte nur für wenige
- Team-spezifische Rollen
- Health-Konfigurationen pflegen:
- Custom Health Checks für eigene CRDs, falls nötig
- Klare Namenskonventionen für Applications, Projekte und Repos
- App-of-Apps für große Landschaften:
- z.B.
cluster-bootstrapApplication, die alle anderen Apps initialisiert
- z.B.
14. Typische Fallstricke
- Drift durch manuelle Änderungen:
- Ursache für OutOfSync und schwer zu reproduzierende Zustände
- Fehlerhafte oder komplexe Helm-/Kustomize-Setups:
- Render-Probleme im Repo-Server bei sehr komplexen Konfigurationen
- Unzureichende Rechte im Ziel-Cluster:
- Argo CD-Service-Account braucht passende RBAC-Rechte
- Netzwerk-/Firewall-Probleme:
- Argo CD muss das Git-Repo erreichen können (Proxy, SSL, SSH-Keys)
- Stateful-Migrationen:
- Vorsicht bei Datenbank-Migrationen im Sync-Prozess (Hook-Jobs, Migrationsphasen)
15. Argo CD vs. andere GitOps-Tools (z.B. Flux)
Kurzvergleich zu Flux (ein anderes populäres GitOps-Tool):
- Argo CD:
- Sehr starke, moderne UI
- Klare Application-Entität
- Häufig intuitiv für Teams, die visuelle Steuerung wünschen
- Flux:
- Sehr „Kubernetes-native“, keine eigene zentrale UI (oft mit zusätzlicher UIs wie Weave GitOps)
- Stärker über CRDs und CLI gesteuert, weniger „zentrales“ Dashboard
Beide implementieren GitOps; die Wahl hängt oft von:
- UI-Bedarf
- Präferenzen des Teams
- Vorhandenen Ökosystem-Komponenten