adesso Blog

Warum GitOps? (Und was war nochmal das Problem?)

In der Welt der cloud-Nativen Entwicklung ist Continuous Deployment (CD) ein Muss. Aber klassische, imperative "Push"-Pipelines stoßen schnell an ihre Grenzen. Vielleicht kennt ihr das: Manuelles Anstoßen, fehlende Transparenz und die ständige Sorge vor dem "Environment Drift".

Environment Drift (Umgebungsdrift) beschreibt den Zustand, in dem sich die tatsächliche Konfiguration einer Umgebung (zum Beispiel ein Kubernetes-Cluster) von der in der Versionskontrolle (Git) definierten gewünschten Konfiguration unterscheidet.

Im Kontext von GitOps bedeutet dies, dass die "Live"-Umgebung nicht mehr synchron mit dem Git-Repository ist. Dies tritt oft auf, wenn manuelle Änderungen direkt am Cluster vorgenommen werden und diese Änderungen nicht im Git-Repository nachgeführt werden. Tools wie ArgoCD erkennen diesen Drift und können entweder melden, dass ein Sync erforderlich ist, oder die Umgebung automatisch in den gewünschten Zustand zurücksetzen (Self-Healing).

Genau hier setzt GitOps an. Es ist ein Ansatz, der die Prinzipien von Infrastructure as Code (IaC) aufgreift und sie konsequent auf das Application-Deployment anwendet. Bevor wir tiefer in ArgoCD eintauchen, rufen wir uns die Kernprinzipien noch einmal ins Gedächtnis:

  • Git als Single Source of Truth: Alles, wirklich alles – von der App-Konfiguration bis zur Infrastruktur – ist deklarativ in Git beschrieben.
  • Deklarativer Soll-Zustand: Wir beschreiben was laufen soll, nicht wie es dorthin kommt.
  • Kontinuierliche Synchronisierung (Pull-Prinzip): Ein Agent im Cluster (wie ArgoCD) zieht sich die Änderungen automatisch aus Git und gleicht den Live-Zustand mit dem Soll-Zustand ab.
  • Automatische Korrektur: Weicht der Live-Zustand ab (Drift), stellt der Agent den Soll-Zustand aus Git wieder her.

ArgoCD: Der GitOps-Operator für Kubernetes

ArgoCD ist ein quelloffenes, deklaratives GitOps-Werkzeug, das speziell für Kubernetes entwickelt wurde. Es ist mittlerweile ein "Graduated"-Projekt der Cloud Native Computing Foundation (CNCF) – ein klarer Indikator für seine Reife und Beliebtheit.

Stellt euch ArgoCD als einen unermüdlichen Agenten (einen Kubernetes-Operator) vor, der in eurem Cluster lebt. Seine einzige Aufgabe ist es, den Zustand eures Clusters (den Live-Zustand) mit dem von euch definierten Soll-Zustand in einem Git-Repository zu vergleichen.

Der Workflow ist dabei denkbar einfach und robust:

  • 1. Ihr (oder eine CI-Pipeline) ändert ein Manifest in Git (zum Beispiel erhöht ihr die Image-Version eures Microservices).
  • 2. ArgoCD bemerkt diese Änderung (per Webhook oder regelmäßigem Pollen).
  • 3. ArgoCD vergleicht den neuen Soll-Zustand (Git) mit dem Live-Zustand (Kubernetes). Es stellt fest: "Aha, die Applikation ist 'OutOfSync'."
  • 4. ArgoCD leitet den Abgleich ein (entweder automatisch oder nach eurer manuellen Freigabe) und wendet die Änderungen auf das Cluster an, bis der Live-Zustand exakt dem Soll-Zustand in Git entspricht.

Über diesen reinen Abgleich hinaus bietet ArgoCD aber noch weitere Kern-Features, die es für DevOps-Teams so wertvoll machen:

  • Die visuelle Weboberfläche: Das ist oft der größte "Wow-Effekt". Ihr seht auf einen Blick den Zustand all eurer Applikationen. Ist etwas "OutOfSync"? Gab es einen Konfigurations-Drift? Die UI macht den Zustand des gesamten Clusters transparent und nachvollziehbar.
  • Automatisches Self-Healing: Ihr könnt ArgoCD so konfigurieren, dass es Abweichungen nicht nur meldet, sondern proaktiv korrigiert. Wenn ein Teammitglied manuell eine Konfiguration im Cluster per kubectl ändert (Drift), stellt ArgoCD den in Git definierten Soll-Zustand automatisch wieder her. Das erzwingt die "Single Source of Truth".
  • Flexible Synchronisierungsstrategien: Nicht jede Änderung soll sofort live gehen. Ihr könnt pro Applikation entscheiden: Soll der Sync automatisch (zum Beispiel in 'dev') oder manuell nach einer Freigabe (zum Beispiel. in 'prod') erfolgen? Ihr könnt auch festlegen, ob ArgoCD veraltete Ressourcen, die nicht mehr in Git sind, automatisch entfernt (Pruning).

Ganzheitliche Optimierung von IT-Service-Organisationen

Wir bringen eure IT aufs nächste Level

Unser ITMC-Team optimiert IT-Service-Organisationen strategisch, technisch und prozessual durch Beratung und Implementierung kundenindividueller Lösungen.

Entdeckt, wie wir DevOps, GitOps und Cloud Service Management in anspruchsvollen Enterprise-Umgebungen ganzheitlich realisieren. Unsere Expertinnen und Experten unterstützen euch dabei, automatisierte Deployment-Prozesse, skalierbare Kubernetes-Architekturen und moderne Betriebsmodelle miteinander verbinden.

Mehr erfahren und unverbindlich Kontakt aufnehmen


Die Skalierungs-Falle: Wenn ein Tool nicht reicht

ArgoCD löst also das Problem des automatisierten Abgleichs einer Applikation hervorragend. Was passiert aber, wenn ihr nicht nur eine Applikation habt, sondern eine komplexe Microservice-Architektur mit 10, 50 oder sogar 200 Services?

Hier gerät der naive Ansatz schnell an seine Grenzen.Ihr müsstet für jeden einzelnen Microservice eine eigene ArgoCD-Application-Ressource (also ein YAML-Manifest) erstellen und pflegen. Das ist nicht nur mühsam, sondern auch fehleranfällig.

Stellt euch vor, ihr wollt eine komplett neue Umgebung, sagen wir "Staging", aufsetzen. Ihr müsstet nun 50 einzelne Application-Manifeste kopieren, anpassen und sicherstellen, dass auch wirklich alle Services im Cluster registriert werden. Vergesst ihr einen, fehlt er in der Umgebung. Dieses manuelle Vorgehen ist genau das Gegenteil von dem robusten, automatisierten Prozess, den wir mit GitOps eigentlich erreichen wollen.

Es skaliert nicht. Wir brauchen also einen Weg, um ganze Applikations-Landschaften zentral und automatisiert zu verwalten.

Praxis: Skalierung mit dem „App-of-Apps“-Pattern

Hier kommt das "App-of-Apps"-Pattern ins Spiel. Die Idee ist so einfach wie genial: Was, wenn wir ArgoCD benutzen, um ArgoCD-Applikationen selbst zu verwalten?

Ihr erstellt eine einzige ArgoCD-Applikation, die wir "Root-App" oder "App-of-Apps" nennen. Diese Applikation zeigt auf ein Git-Repository. Der entscheidende Unterschied: In diesem Repository liegen keine Deployment-Manifeste für eure Microservices, sondern nur die Application-Manifeste für alle anderen Services.

Die "Root-App" hat also nur eine Aufgabe: Andere ArgoCD-Applikationen zu synchronisieren. Stellt euch das wie einen Baum vor: Die "App-of-Apps" ist der Stamm und jede einzelne eurer 50 Microservice-Applikationen ist ein Ast.

So strukturiert ihr euer Git-Repository

Um das Pattern effizient zu nutzen, hat sich eine Ordnerstruktur bewährt, die eure Umgebungen (zum Beispiel dev, staging, prod) klar voneinander trennt.

Ein gängiger Ansatz ist die Verwendung von Helm, dem Paketmanager für Kubernetes. Ihr erstellt ein sogenanntes Umbrella-Chart. Dieses Helm-Chart ist im Grunde eure "App-of-Apps".

Stellt euch folgende Repository-Struktur vor:

	
		gitops-repo/
		├── environments/
		│   ├── dev/
		│   │   ├── values.yaml   # Hier werden alle Apps für 'dev' aktiviert
		│   ├── staging/
		│   │   ├── values.yaml   # Hier werden alle Apps für 'staging' aktiviert
		│   └── prod/
		│       ├── values.yaml   # Hier werden alle Apps für 'prod' aktiviert
		│
		└── app-of-apps-chart/    # Das Helm Umbrella-Chart    
		├── Chart.yaml    
		├── templates/    
		│   └── application.yaml  # Template, das ArgoCD-Apps generiert    
		└── values.yaml       # Standard-Werte (meist leer)
	

Das Helm-Chart als App-Generator

Das Herzstück ist die Datei app-of-apps-chart/templates/application.yaml. Sie ist keine normale Kubernetes-Ressource, sondern ein Template, das ArgoCD-Application-Ressourcen generiert.

Es könnte vereinfacht so aussehen:

	
		# app-of-apps-chart/templates/application.yaml
		{{- range .Values.applications }}
		apiVersion: argoproj.io/v1alpha1
		kind: Application
		metadata:  
		 name: {{ .name }}  
		 namespace: argocd
		spec:  
		 project: default  
		 source:    
		  repoURL: {{ .repoURL }}    
		  targetRevision: {{ .targetRevision }}    
		  path: {{ .path }}  
		 destination:    
		  server: https://kubernetes.default.svc    
		  namespace: {{ .namespace }}  
		 syncPolicy:    
		  automated:      
		   prune: true      
		   selfHeal: true
		---
		{{- end }}
	
Die values.yaml als zentrales Steuer-Element

Die Magie passiert nun in den values.yaml-Dateien eurer Umgebungen. Um einen Service in dev zu deployen, tragt ihr ihn einfach dort ein:

	
		# environments/dev/values.yaml
		applications:  
		 - name: user-service-dev    
		  namespace: dev    
		  repoURL: "https://git.euer-server.de/user-service.git"    
		  targetRevision: "main"    
		  path: "helm/charts"  
		 - name: payment-service-dev    
		  namespace: dev    
		  repoURL: "https://git.euer-server.de/payment-service.git"    
		  targetRevision: "main"    
		  path: "helm/charts"  
		 # ... weitere 48 Applikationen
	

Ihr habt jetzt eine ArgoCD-Applikation (die "Root-App" für dev), die auf environments/dev/ zeigt. Wenn ihr einen neuen Service hinzufügen wollt, müsst ihr nur diese eine values.yaml im Git-Repository anpassen. ArgoCD und Helm erledigen den Rest, generieren die neue Application-Ressource und deployen euren Service.

Dieses Pattern ist der entscheidende Schritt, um GitOps von der Verwaltung einzelner Services zur Orchestrierung ganzer Landschaften zu heben und auch in komplexen Enterprise-Umgebungen sauber und skalierbar zu bleiben.

Fazit

GitOps ist mehr als nur ein Buzzword, es ist ein fundamentaler Wandel hin zu robusteren und transparenteren Deployment-Prozessen auf Kubernetes. Werkzeuge wie ArgoCD machen die Implementierung dieses Pull-Prinzips greifbar und effizient.

Wie wir gesehen haben, löst ArgoCD das reine Deployment-Problem hervorragend. Der entscheidende Schritt für den Einsatz in komplexen Enterprise-Umgebungen ist jedoch das „App-of-Apps“-Pattern. Es ist die Antwort auf die Skalierungs-Falle und ermöglicht es euch, Dutzende oder Hunderte von Applikationen zentral, automatisiert und übersichtlich zu verwalten. Erst damit wird GitOps wirklich zum skalierbaren Rückgrat eures Continuous Deployments.


Cloud-Partnerschaften, die GitOps möglich machen

Moderne GitOps-Ansätze wie Continuous Deployment mit ArgoCD und das App-of-Apps-Pattern entfalten ihr volles Potenzial erst auf einer starken, cloud-nativen Basis. Unsere Cloud-Partnerschaften – von hyperskalierbaren Plattformen über Managed Kubernetes Services bis hin zu sicheren, europäischen Cloud-Optionen – bieten genau diese Grundlage. Erfahrt mehr darüber, wie wir gemeinsam mit führenden Technologiepartnern die Infrastruktur bereitstellen, auf der skalierbare GitOps-Architekturen, automatisierte Deployments und resilienter Cloud-Betrieb zuverlässig funktionieren.

Mehr erfahren und unverbindlich Kontakt aufnehmen


Bild Julian Paul

Autor Julian Paul

Julian Paul ist als Senior Software Engineer bei adesso tätig. Sein Arbeitsschwerpunkt bildet hierbei die Java Entwicklung. Darüber hinaus beschäftigt er sich intensiv mit Themen rund um Cloud Native Development und DevOps.

Kategorie:

Softwareentwicklung

Schlagwörter:

Softwareprojekte

Cloud