9 GitOps-Tools und -Praktiken

9.1 Überblick über GitOps-Tools

Die GitOps-Tool-Landschaft hat sich in den letzten Jahren erheblich entwickelt und bietet heute eine breite Palette spezialisierter Lösungen für verschiedene Anwendungsszenarien. Diese Tools implementieren die Kernprinzipien von GitOps durch automatisierte Synchronisation zwischen Git-Repositories und Zielumgebungen. Die Auswahl des geeigneten Tools hängt von Faktoren wie Anwendungsarchitektur, Team-Größe, Compliance-Anforderungen und bestehender Infrastruktur ab.

9.1.1 Tool-Landschaft und Kategorisierung

GitOps-Tools lassen sich in verschiedene Kategorien einteilen, die unterschiedliche Aspekte des GitOps-Workflow adressieren. Pull-basierte CD-Tools wie ArgoCD und Flux bilden das Herzstück vieler GitOps-Implementierungen. Diese Tools überwachen Git-Repositories kontinuierlich und synchronisieren Änderungen automatisch mit Kubernetes-Clustern. Ihre Architektur folgt dem Prinzip des “Pull” anstatt “Push”, wodurch Sicherheitsrisiken reduziert und bessere Auditierbarkeit erreicht wird.

Tool-Kategorie Hauptvertreter Einsatzbereich Besonderheiten
Pull-basierte CD-Tools ArgoCD, Flux Core GitOps Synchronisation Pull-Architektur, Security
Application Lifecycle ArgoCD, Flux, Jenkins X Multi-Environment Management Web-UI, Health Monitoring
Platform Engineering Jenkins X, Backstage Developer Experience Self-Service Portale
Configuration Management Kustomize, Helm Template & Parametrisierung Wiederverwendbarkeit

Application-Lifecycle-Management-Tools erweitern grundlegende Synchronisationsfunktionen um erweiterte Features wie Multi-Environment-Management, Progressive Delivery und Application Health Monitoring. Diese Tools bieten oft grafische Benutzeroberflächen, die Entwicklern und Operations-Teams bessere Einblicke in Deployment-Status und Application-Topologie geben.

Platform-Engineering-Tools wie Jenkins X oder Backstage integrieren GitOps in umfassendere Developer Experience Platforms. Diese Lösungen abstrahieren die Komplexität der zugrundeliegenden GitOps-Mechanismen und bieten Self-Service-Portale für Entwickler. Dadurch können Teams GitOps-Vorteile nutzen, ohne tiefgreifende Kenntnisse der zugrundeliegenden Technologien entwickeln zu müssen.

Configuration-Management-Tools wie Kustomize oder Helm ergänzen GitOps-Implementierungen durch erweiterte Template- und Parametrisierungsfunktionen. Diese Tools ermöglichen die Wiederverwendung von Basis-Konfigurationen zwischen verschiedenen Umgebungen und reduzieren Configuration Drift durch standardisierte Deployment-Patterns.

9.1.2 Auswahlkriterien für GitOps-Tools

Die Evaluierung von GitOps-Tools erfordert eine systematische Bewertung verschiedener Kriterien. Funktionale Anforderungen umfassen die Unterstützung verschiedener Manifest-Formate, Integration mit bestehenden CI-Pipelines und Fähigkeiten für Multi-Cluster-Management. Teams sollten prüfen, ob Tools ihre spezifischen Deployment-Strategien wie Canary-Releases oder Blue-Green-Deployments unterstützen.

Sicherheitsaspekte spielen eine zentrale Rolle bei der Tool-Auswahl. RBAC-Integration, Secret-Management-Fähigkeiten und Audit-Logging sind essentiell für produktive Umgebungen. Tools sollten Principle-of-Least-Privilege befolgen und granulare Zugriffskontrollen bieten. Die Integration mit externen Identity-Providern und Compliance-Tools kann für regulierte Industrien erforderlich sein.

Skalierbarkeit und Performance-Charakteristika bestimmen die Eignung für verschiedene Anwendungsgrößen. Faktoren wie Anzahl der verwalteten Applications, Cluster-Größe und Sync-Frequenz beeinflussen die Tool-Performance erheblich. Benchmarking verschiedener Tools unter realistischen Lastbedingungen hilft bei der Identifikation geeigneter Lösungen.

Community und Ecosystem-Reife beeinflussen langfristige Wartbarkeit und Feature-Entwicklung. Aktive Communities bieten besseren Support und beschleunigen Problem-Resolution. Die Verfügbarkeit von Plugins, Extensions und Integrationen erweitert Tool-Funktionalität und reduziert Entwicklungsaufwand für Custom-Features.

9.2 Argo CD

ArgoCD hat sich als eines der führenden GitOps-Tools für Kubernetes etabliert und wird von der Cloud Native Computing Foundation als graduiertes Projekt geführt. Die Architektur basiert auf dem Controller-Pattern und implementiert einen Pull-basierten Ansatz für Continuous Deployment. ArgoCD überwacht Git-Repositories kontinuierlich und erkennt Abweichungen zwischen dem gewünschten Zustand im Repository und dem tatsächlichen Zustand im Cluster.

9.2.1 Installation und Konfiguration

Die Installation von ArgoCD erfolgt typischerweise über Kubernetes-Manifeste oder Helm-Charts. Die Standard-Installation erstellt mehrere Komponenten: den Application Controller, den Repository Server, den Dex Server für Authentication und die Web-UI. Für produktive Umgebungen sollten Hochverfügbarkeits-Konfigurationen mit mehreren Controller-Instanzen und externen Datenbanken implementiert werden.

Die initiale Konfiguration umfasst die Erstellung von Repository-Credentials, Project-Definitionen und RBAC-Policies. ArgoCD unterstützt verschiedene Authentication-Mechanismen, von lokalen Accounts bis hin zu Integration mit OIDC-Providern wie Azure AD oder Keycloak. Project-basierte Isolation ermöglicht Multi-Tenancy und granulare Zugriffskontrolle.

apiVersion: v1
kind: Namespace
metadata:
  name: argocd
---
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  description: Production applications
  sourceRepos:
  - 'https://github.com/company/k8s-manifests'
  destinations:
  - namespace: '*'
    server: https://kubernetes.default.svc
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace
  - group: 'rbac.authorization.k8s.io'
    kind: ClusterRole
  namespaceResourceWhitelist:
  - group: 'apps'
    kind: Deployment
  - group: ''
    kind: Service
  roles:
  - name: production-admin
    policies:
    - p, proj:production:production-admin, applications, *, production/*, allow
    groups:
    - company:production-team

9.2.2 Application-Definitionen

ArgoCD Applications definieren den Mapping zwischen Git-Repositories und Kubernetes-Ressourcen. Eine Application spezifiziert die Source (Git Repository, Branch, Path), das Destination (Cluster, Namespace) und Sync-Policies. Applications können imperativ über die CLI oder Web-UI erstellt werden, jedoch folgt die deklarative Definition über Git dem GitOps-Prinzip besser.

Application-Sets erweitern das Application-Konzept um Template-basierte Generierung mehrerer Applications. Diese Funktion ist besonders nützlich für Multi-Cluster oder Multi-Tenant Szenarien, wo identische Applications in verschiedenen Umgebungen deployed werden müssen. Generator-Pattern ermöglichen die dynamische Erstellung von Applications basierend auf Git-Repository-Struktur oder externen Datenquellen.

Health-Checks und Sync-Status werden kontinuierlich von ArgoCD überwacht. Custom Health Checks können für Anwendungen definiert werden, die nicht den Standard-Kubernetes-Health-Patterns folgen. Resource Hooks ermöglichen die Ausführung von Pre- und Post-Sync-Operationen, wie Datenbank-Migrationen oder Smoke-Tests.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: webapp-prod
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: production
  source:
    repoURL: https://github.com/company/k8s-manifests
    targetRevision: main
    path: applications/webapp/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: webapp-prod
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - ApplyOutOfSyncOnly=true
  revisionHistoryLimit: 10

9.2.3 Sync-Strategien und Policies

ArgoCD bietet verschiedene Sync-Strategien, die das Verhalten bei erkannten Konfigurationsänderungen bestimmen. Manual Sync erfordert explizite Benutzerinteraktion für jeden Deployment-Vorgang und bietet maximale Kontrolle. Automated Sync führt Deployments automatisch durch, sobald Änderungen im Git-Repository erkannt werden. Diese Strategie kann durch Prune und Self-Heal Optionen erweitert werden.

Prune-Policies bestimmen, ob Ressourcen gelöscht werden, die nicht mehr in Git-Manifesten definiert sind. Diese Funktion ist essentiell für die Aufrechterhaltung der Git-Wahrheit als Single Source of Truth. Self-Heal korrigiert automatisch manuelle Änderungen an Kubernetes-Ressourcen, die von der Git-Definition abweichen.

Sync-Windows ermöglichen die zeitliche Begrenzung automatischer Deployments. Maintenance-Windows können für kritische Anwendungen definiert werden, um Deployments außerhalb der Geschäftszeiten zu beschränken. Diese Funktion reduziert das Risiko von Service-Unterbrechungen während peak Usage-Zeiten.

Progressive Sync ermöglicht die schrittweise Bereitstellung von Änderungen durch Integration mit Service-Mesh-Tools oder speziellen Deployment-Strategien. Waves können verwendet werden, um Dependencies zwischen verschiedenen Anwendungskomponenten zu respektieren und geordnete Deployment-Sequenzen sicherzustellen.

9.2.4 Web-UI und CLI-Nutzung

Die ArgoCD Web-UI bietet eine grafische Darstellung des Application-Status und ermöglicht interaktive Deployment-Operationen. Das Dashboard zeigt Health-Status, Sync-Status und Resource-Topologie für alle verwalteten Applications. Detailed Views ermöglichen das Inspizieren einzelner Kubernetes-Ressourcen und deren Status.

Application-Topology-Ansichten visualisieren Abhängigkeiten zwischen verschiedenen Kubernetes-Ressourcen und helfen beim Verständnis komplexer Anwendungsarchitekturen. Live-Updates zeigen Änderungen in Real-Time und ermöglichen schnelle Problem-Identifikation. Resource-Level-Details bieten Zugriff auf Events, Logs und Manifest-Diffs.

Die ArgoCD CLI ergänzt die Web-UI um scriptbare Operationen und erweiterte Funktionen. Bulk-Operationen können über die CLI effizienter durchgeführt werden als über die Web-UI. Integration in CI-Pipelines und Automation-Scripts erfolgt typischerweise über CLI-Commands.

# Login to ArgoCD
argocd login argocd.company.com --username admin

# Create application
argocd app create webapp-prod \
  --repo https://github.com/company/k8s-manifests \
  --path applications/webapp/overlays/production \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace webapp-prod \
  --project production

# Sync application
argocd app sync webapp-prod

# Check application status
argocd app get webapp-prod

# View application logs
argocd app logs webapp-prod -f

9.3 Flux

Flux v2 repräsentiert eine vollständige Neuarchitektur des ursprünglichen Flux-Projekts und folgt einem Controller-basierten Ansatz mit modularen Komponenten. Die Architektur basiert auf dem GitOps Toolkit, einer Sammlung spezialisierter Controller, die verschiedene Aspekte des GitOps-Workflow adressieren. Diese modulare Struktur ermöglicht flexible Deployment-Konfigurationen und bessere Integration mit bestehenden Kubernetes-Ökosystemen.

9.3.1 Flux v2 Architektur

Die Flux v2 Architektur besteht aus mehreren spezialisierten Controllern, die jeweils spezifische Verantwortlichkeiten haben. Der Source Controller verwaltet Git-Repositories, Helm-Repositories und Bucket-Sources. Er überwacht diese Quellen auf Änderungen und stellt Artefakte für andere Controller bereit. Diese Trennung ermöglicht die Wiederverwendung von Sources zwischen verschiedenen Deployments.

Controller Hauptfunktion Verantwortlichkeiten
Source Controller Repository Management Git, Helm, Bucket Sources
Kustomize Controller Kustomize-basierte Deployments Overlays, Variable Substitution
Helm Controller Helm Chart Management Chart Installation, Values
Notification Controller Event Handling Alerts, Webhooks, Integrations
Image Automation Controller Image Updates Automated Image Tag Updates

Der Kustomize Controller wendet Kustomize-basierte Konfigurationen auf Kubernetes-Cluster an. Er kann Complex Overlays verwalten und unterstützt erweiterte Features wie Variable Substitution und Resource-Ordering. Der Controller überwacht kontinuierlich den Sync-Status und führt automatische Reconciliation durch.

Der Helm Controller ermöglicht die Installation und Verwaltung von Helm-Charts durch Flux. Er unterstützt sowohl lokale Charts aus Git-Repositories als auch Charts aus Helm-Repositories. Dependency-Management und Values-Overrides werden nahtlos in GitOps-Workflows integriert.

Notification Controller und Image Automation Controller erweitern die Basis-Funktionalität um Event-Handling und automatische Image-Updates. Diese Controller ermöglichen erweiterte Workflow-Automation und Integration mit externen Systemen.

apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
  name: webapp-source
  namespace: flux-system
spec:
  interval: 30s
  ref:
    branch: main
  url: https://github.com/company/k8s-manifests
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: webapp-prod
  namespace: flux-system
spec:
  interval: 10m
  sourceRef:
    kind: GitRepository
    name: webapp-source
  path: "./applications/webapp/overlays/production"
  prune: true
  validation: client
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: webapp
      namespace: webapp-prod

9.3.2 Source Controller und Kustomize Controller

Der Source Controller fungiert als Abstraktionsschicht für verschiedene Arten von Configuration Sources. Git-Repository-Sources werden in regelmäßigen Intervallen überwacht und Änderungen werden als Events an abhängige Controller weitergeleitet. Authentifizierung erfolgt über Kubernetes-Secrets und unterstützt SSH-Keys, Personal Access Tokens und weitere Mechanismen.

Helm-Repository-Sources ermöglichen die Integration von Helm-Charts aus öffentlichen oder privaten Repositories. Der Controller lädt Chart-Metadaten herunter und stellt diese für Helm-Controller-Instanzen bereit. Version-Constraints und Repository-Credentials werden durch Custom Resources konfiguriert.

Bucket-Sources erweitern Flux um die Unterstützung von Object-Storage-basierten Artefakten. AWS S3, Google Cloud Storage oder Azure Blob Storage können als Configuration-Sources verwendet werden. Diese Flexibilität ermöglicht Integration mit bestehenden Artifact-Management-Workflows.

Der Kustomize Controller konsumiert Git-Repository-Sources und wendet Kustomize-Transformationen auf Kubernetes-Manifeste an. Variable Substitution ermöglicht die Parametrisierung von Deployments basierend auf Environment-spezifischen Werten. Post-Build-Substitution kann ConfigMap- oder Secret-Werte in Manifeste einbetten.

Health Checks überwachen den Status von deployed Resources und melden Probleme über Kubernetes-Events. Custom Health Checks können für Anwendungen definiert werden, die spezielle Status-Indikatoren verwenden. Dependency-Ordering gewährleistet, dass Resources in der korrekten Reihenfolge angewendet werden.

9.3.3 Helm Controller Integration

Der Helm Controller erweitert Flux um native Helm-Chart-Unterstützung und ermöglicht die deklarative Verwaltung von Helm-Releases durch Kubernetes Custom Resources. HelmRelease-Objekte definieren Chart-Sources, Values-Overrides und Release-Konfiguration. Diese Integration kombiniert Helm-Flexibilität mit GitOps-Prinzipien.

Values-Dateien können aus verschiedenen Sources bezogen werden, einschließlich ConfigMaps, Secrets oder Git-Repositories. Diese Flexibilität ermöglicht die Trennung von Chart-Definitionen und Environment-spezifischen Konfigurationen. Values-References unterstützen auch die Einbindung von Werten aus externen Systems.

Helm-Hooks werden durch den Controller respektiert und ermöglichen Pre- und Post-Install-Operationen. Test-Hooks können für automatische Validierung nach Deployments verwendet werden. Custom Resource Definitions und Namespace-Creation werden automatisch verwaltet.

Rollback-Mechanismen nutzen Helm-Release-Historie für automatische oder manuelle Rollbacks bei erkannten Problemen. Failure-Remediation kann automatische Rollbacks auslösen, wenn Health Checks fehlschlagen oder Deployment-Timeouts auftreten.

apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
  name: bitnami
  namespace: flux-system
spec:
  interval: 24h
  url: https://charts.bitnami.com/bitnami
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: webapp-database
  namespace: webapp-prod
spec:
  interval: 30m
  chart:
    spec:
      chart: postgresql
      version: "11.6.12"
      sourceRef:
        kind: HelmRepository
        name: bitnami
        namespace: flux-system
  values:
    auth:
      postgresPassword: "secure-password"
      database: "webapp"
    primary:
      persistence:
        size: 10Gi
  install:
    remediation:
      retries: 3
  upgrade:
    remediation:
      retries: 3

9.3.4 Monitoring und Alerting

Flux v2 bietet umfassende Observability-Features durch Integration mit Prometheus und Standard-Kubernetes-Monitoring-Tools. Controller-Metriken werden über Standard-Prometheus-Endpoints exportiert und umfassen Sync-Frequenz, Error-Rates und Resource-Status. Diese Metriken ermöglichen die Überwachung der GitOps-Pipeline-Health.

Event-basiertes Alerting nutzt Kubernetes-Events für Benachrichtigungen über Sync-Failures, Health-Check-Probleme oder Security-Issues. Der Notification Controller kann Events an verschiedene Systeme weiterleiten, einschließlich Slack, Microsoft Teams, PagerDuty oder Webhook-basierte Integrationen.

Custom Alerts können basierend auf spezifischen Conditions oder Resource-Status definiert werden. Alert-Manager-Integration ermöglicht sophisticated Alerting-Rules und Escalation-Policies. Observability-Dashboards für Grafana sind verfügbar und bieten vorgefertigte Visualisierungen für Flux-Metriken.

Audit-Logging verfolgt alle Änderungen und Sync-Operationen für Compliance-Anforderungen. Structured Logging ermöglicht effiziente Log-Aggregation und Analysis. Integration mit Centralized Logging-Systemen wie ELK-Stack oder Fluentd wird durch Standard-Kubernetes-Logging-Patterns unterstützt.

9.4 Jenkins X

Jenkins X repräsentiert einen opinionated Ansatz für CloudNative CI/CD und integriert GitOps-Prinzipien in eine umfassende Developer Experience Platform. Die Platform abstrahiert die Komplexität von Kubernetes und GitOps durch Self-Service-Portale und automatisierte Pipeline-Generierung. Jenkins X fokussiert auf Developer Productivity und reduziert die Time-to-Value für neue Projekte erheblich.

9.4.1 Pipeline-as-Code mit Tekton

Jenkins X nutzt Tekton als Pipeline-Engine und ermöglicht die Definition von CI/CD-Workflows durch Cloud-Native-Pipelines. Tekton-Tasks kapseln individuelle Pipeline-Schritte und können zwischen verschiedenen Pipelines wiederverwendet werden. Diese Modularität reduziert Duplikation und fördert Best-Practice-Sharing zwischen Teams.

Pipeline-Definitionen werden als Kubernetes Custom Resources gespeichert und folgen dem GitOps-Prinzip. Änderungen an Pipelines werden durch Git-Workflows verwaltet und automatisch auf Kubernetes-Cluster angewendet. Diese Integration gewährleistet Konsistenz zwischen Development- und Production-Pipelines.

Build-Packs automatisieren die Pipeline-Generierung für verschiedene Application-Types. Unterstützte Sprachen und Frameworks erhalten vorkonfigurierte Pipelines, die Best Practices für Testing, Security-Scanning und Deployment implementieren. Custom Build-Packs können für organisationsspezifische Standards entwickelt werden.

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: webapp-pipeline
spec:
  params:
    - name: git-url
      type: string
    - name: git-revision
      type: string
  workspaces:
    - name: shared-data
  tasks:
    - name: fetch-source
      taskRef:
        name: git-clone
      workspaces:
        - name: output
          workspace: shared-data
      params:
        - name: url
          value: $(params.git-url)
        - name: revision
          value: $(params.git-revision)
    - name: build-test
      taskRef:
        name: maven
      runAfter:
        - fetch-source
      workspaces:
        - name: source
          workspace: shared-data
      params:
        - name: GOALS
          value: ["clean", "test", "package"]
    - name: build-image
      taskRef:
        name: buildah
      runAfter:
        - build-test
      workspaces:
        - name: source
          workspace: shared-data
      params:
        - name: IMAGE
          value: "registry.company.com/webapp:$(params.git-revision)"

9.4.2 GitOps-Repository-Management

Jenkins X implementiert eine spezifische GitOps-Repository-Struktur, die Source-Code-Repositories von Configuration-Repositories trennt. Application-Repositories enthalten Source-Code und Pipeline-Definitionen, während Environment-Repositories Kubernetes-Manifeste und Deployment-Konfigurationen verwalten. Diese Trennung ermöglicht unterschiedliche Access-Patterns und Approval-Workflows.

Promotion-Pipelines automatisieren die Bewegung von Artefakten zwischen verschiedenen Umgebungen. Successful Builds in Development-Umgebungen lösen automatische Promotion zu Staging aus, während Production-Deployments manuelle Approval erfordern können. Pull-Request-basierte Promotion gewährleistet Audit-Trails und ermöglicht Review-Prozesse.

Environment-Templates standardisieren die Konfiguration neuer Umgebungen und reduzieren Setup-Zeit für neue Projekte. Templates können organisationsspezifische Policies, Security-Konfigurationen und Monitoring-Setup einschließen. Parameterisierte Templates ermöglichen Anpassungen an verschiedene Project-Requirements.

GitOps-Operators überwachen Environment-Repositories und wenden Änderungen automatisch auf Kubernetes-Cluster an. Diese Operators implementieren das Pull-basierte GitOps-Pattern und gewährleisten, dass Cluster-Zustand mit Git-Definitionen synchron bleibt. Multi-Cluster-Support ermöglicht die Verwaltung verschiedener Umgebungen über mehrere Kubernetes-Cluster hinweg.

9.4.3 Preview-Environments

Preview-Environments sind ein distinguierendes Feature von Jenkins X und ermöglichen die automatische Erstellung temporärer Umgebungen für Pull-Requests. Diese Environments erlauben es Entwicklern und Reviewers, Änderungen in isolierten Umgebungen zu testen, bevor sie in gemeinsame Branches merged werden. Preview-Environments reduzieren Integration-Probleme und verbessern Code-Quality erheblich.

Die Erstellung von Preview-Environments wird durch Pull-Request-Events ausgelöst und folgt automatisierten Workflows. Kubernetes-Namespaces werden dynamisch erstellt und mit Application-Instanzen populated, die auf dem Pull-Request-Code basieren. DNS-Routing und Ingress-Konfiguration werden automatisch generiert, um externe Zugriffe zu ermöglichen.

Resource-Management für Preview-Environments umfasst automatische Cleanup-Mechanismen und Resource-Quotas. Idle-Timeout-Policies können nicht-verwendete Environments automatisch löschen, um Resource-Verschwendung zu vermeiden. Cost-Monitoring und Budgeting-Alerts helfen bei der Kontrolle von Preview-Environment-Kosten.

Integration mit Review-Workflows erweitert Pull-Request-Comments um Links zu Preview-Environments und automatische Test-Results. GitHub, GitLab und andere Git-Provider werden nativ unterstützt. Status-Checks können Preview-Environment-Health in Pull-Request-Status integrieren.

9.5 Implementierung von GitOps-Praktiken mit diesen Tools

Die praktische Implementierung von GitOps-Workflows erfordert die Kombination verschiedener Tools und die Etablierung organisatorischer Praktiken. Erfolgreiche GitOps-Adoptierung hängt von technischen Tool-Konfigurationen und kulturellen Änderungen in Development- und Operations-Teams ab.

9.5.1 Multi-Repository vs. Mono-Repository-Ansätze

Die Wahl zwischen Multi-Repository und Mono-Repository-Strukturen beeinflusst fundamental die Organisation von GitOps-Workflows. Multi-Repository-Ansätze trennen Application-Code, Infrastructure-Code und Environment-Konfigurationen in separate Repositories. Diese Trennung ermöglicht unterschiedliche Access-Controls, Release-Zyklen und Team-Verantwortlichkeiten.

Mono-Repository-Strukturen konsolidieren alle Project-Artefakte in einem einzigen Repository und vereinfachen Dependency-Management sowie atomare Changes. Diese Ansätze eignen sich besonders für kleinere Teams oder tightly-coupled Anwendungen. Tooling für Mono-Repositories muss Selective Triggering und Path-based Filtering unterstützen.

Hybrid-Ansätze kombinieren Vorteile beider Strategien durch logische Separierung innerhalb einer übergeordneten Repository-Struktur. Subtrees oder Submodules können verwendet werden, um Semi-autonome Komponenten zu verwalten. Diese Flexibilität erfordert jedoch sophisticated Tooling und klare Governance-Policies.

Repository-Strukturen sollten Team-Topologien und Conway’s Law berücksichtigen. Product-Teams können Application-Repositories besitzen, während Platform-Teams Infrastructure-Repositories verwalten. Clear Ownership-Models reduzieren Conflicts und beschleunigen Decision-Making.

9.5.2 Environment-Promotion-Strategien

Environment-Promotion definiert den Weg von Code-Changes durch verschiedene Deployment-Stages bis zur Production. Linear-Promotion folgt einer sequenziellen Kette von Development über Staging zu Production. Jede Stage validiert verschiedene Aspekte der Anwendung und fungiert als Quality Gate für nachgelagerte Environments.

Branch-based Promotion nutzt Git-Branches für verschiedene Environment-Stages. Feature-Branches werden in Development-Branches merged, die automatisch Development-Environments aktualisieren. Release-Branches triggern Staging-Deployments, während Production-Deployments über Main-Branch-Merges erfolgen. Diese Strategie align GitOps mit etablierten Git-Workflows.

Tag-based Promotion verwendet Git-Tags für Release-Markierung und Environment-Targeting. Semantic Versioning kann für automatische Promotion-Rules verwendet werden. Alpha- und Beta-Tags können Staging-Deployments auslösen, während Release-Tags Production-Deployments triggern. Tag-basierte Strategien bieten explicite Release-Kontrolle und einfache Rollback-Mechanismen.

Pull-Request-based Promotion implementiert Approval-Workflows durch Git-Provider-Features. Production-Promotions erfordern Pull-Requests mit mandatory Reviews von authorized Personnel. Automated Tests und Quality Gates werden als Required Status Checks konfiguriert. Diese Integration nutzt bestehende Code-Review-Prozesse für Deployment-Approvals.

9.5.3 Secret-Management-Patterns

Secret-Management in GitOps-Umgebungen erfordert besondere Aufmerksamkeit, da Secrets nicht in plaintext in Git-Repositories gespeichert werden können. Sealed Secrets von Bitnami verschlüsseln Secrets mit Public-Key-Cryptography und ermöglichen sichere Speicherung in Git. Sealed Secret Controllers im Cluster dekryptieren diese Secrets und erstellen entsprechende Kubernetes Secret-Objekte.

External Secret Operators integrieren GitOps-Workflows mit externen Secret-Management-Systemen wie HashiCorp Vault, AWS Secrets Manager oder Azure Key Vault. ExternalSecret Custom Resources definieren, welche Secrets aus externen Systemen bezogen und als Kubernetes Secrets bereitgestellt werden sollen. Diese Patterns trennen Secret-Storage von GitOps-Repositories.

SOPS (Secrets OPerationS) ermöglicht die Verschlüsselung von Secrets direkt in Git-Repositories durch Integration mit Cloud-Provider-KMS oder PGP. Flux v2 bietet native SOPS-Integration und kann verschlüsselte Secrets automatisch dekryptieren. Diese Lösung eignet sich für Teams, die Secret-Definitionen nahe bei Application-Konfigurationen verwalten möchten.

ArgoCD Vault Plugin erweitert ArgoCD um Vault-Integration und ermöglicht die Injektion von Secrets zur Deployment-Zeit. Placeholder-Syntax in Manifesten wird durch echte Secret-Werte ersetzt, ohne dass Secrets jemals in Git gespeichert werden. Diese Herangehensweise bietet Flexibilität bei der Secret-Verwaltung ohne Kompromisse bei der Sicherheit.

# Sealed Secret example
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: webapp-secrets
  namespace: production
spec:
  encryptedData:
    database-password: AgAKW1pZ2...
    api-key: AgBh3k2F1...
  template:
    metadata:
      name: webapp-secrets
      namespace: production
    type: Opaque
---
# External Secret example
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: webapp-secrets
  namespace: production
spec:
  refreshInterval: 5m
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: webapp-secrets
    creationPolicy: Owner
  data:
    - secretKey: database-password
      remoteRef:
        key: secret/webapp/prod
        property: db_password
    - secretKey: api-key
      remoteRef:
        key: secret/webapp/prod
        property: api_key

Die Implementierung erfolgreicher GitOps-Praktiken erfordert die sorgfältige Auswahl und Konfiguration geeigneter Tools sowie die Etablierung organisatorischer Prozesse, die GitOps-Prinzipien unterstützen. Die beschriebenen Tools und Patterns bieten bewährte Ansätze für verschiedene Anwendungsszenarien und können als Grundlage für organisationsspezifische GitOps-Implementierungen dienen.