5 Controller Pattern in GitOps

5.1 Was ist das Controller Pattern?

Das Controller Pattern ist das Herzstück von GitOps. Ein Controller überwacht kontinuierlich den gewünschten Zustand (Git) und den aktuellen Zustand (Cluster) und sorgt dafür, dass beide übereinstimmen.

Einfache Analogie:
Stellen Sie sich einen Thermostat vor. Er kennt die gewünschte Temperatur (20°C), misst die aktuelle Temperatur (18°C) und schaltet die Heizung ein, bis das Ziel erreicht ist.

Gewünschter Zustand (Git) ←→ Controller ←→ Aktueller Zustand (Cluster)
        20°C                  Thermostat              18°C

5.2 Der Reconciliation Loop

Jeder GitOps-Controller arbeitet in einem endlosen Zyklus:

5.2.1 Typische Loop-Zeiten

Controller Standard-Intervall Konfigurierbar
ArgoCD 3 Minuten timeout.reconciliation
Flux 1 Minute spec.interval
Jenkins X 2 Minuten Pipeline-abhängig

5.3 Controller-Arten in GitOps

5.3.1 Application Controller (ArgoCD)

Der ArgoCD Application Controller überwacht einzelne Anwendungen:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
spec:
  source:
    repoURL: https://github.com/myorg/myapp
    path: k8s
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      selfHeal: true    # Automatische Drift-Korrektur
      prune: true       # Löscht nicht-deklarierte Ressourcen

Funktionsweise: 1. Pollt Git Repository alle 3 Minuten 2. Vergleicht Git-Manifeste mit Cluster-Zustand 3. Wendet Unterschiede automatisch an (wenn automated aktiviert)

5.3.2 Kustomization Controller (Flux)

Flux nutzt mehrere spezialisierte Controller:

apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: my-app
spec:
  interval: 1m           # Reconciliation alle 60 Sekunden
  sourceRef:
    kind: GitRepository
    name: my-app-repo
  path: "./k8s"
  prune: true
  force: true            # Überschreibt manuelle Änderungen

5.4 Controller-Architektur

5.4.1 ArgoCD Controller

ArgoCD verwendet einen zentralisierten Ansatz:

Komponente Zweck Läuft auf
Application Controller Überwacht Applications Control Plane
Repo Server Git Repository Access Control Plane
Redis Caching & Queuing Control Plane
API Server REST API & UI Control Plane
# ArgoCD Controller Status prüfen
kubectl get pods -n argocd
kubectl logs -n argocd deployment/argocd-application-controller

5.4.2 Flux Controller

Flux verwendet ein verteiltes Design:

Controller Zweck Reconciliation
Source Controller Git/Helm Repository Sync 1 Minute
Kustomize Controller Kustomize Manifests 1 Minute
Helm Controller Helm Charts 1 Minute
Notification Controller Alerts & Webhooks Event-driven
# Flux Controller Status prüfen
flux get sources git
flux get kustomizations
kubectl logs -n flux-system deployment/kustomize-controller

5.5 Custom Resources und CRDs

GitOps-Controller erweitern Kubernetes durch Custom Resource Definitions:

5.5.1 ArgoCD CRDs

# ArgoCD installiert diese CRDs
kubectl get crd | grep argoproj
applications.argoproj.io
applicationsets.argoproj.io
appprojects.argoproj.io

5.5.2 Flux CRDs

# Flux installiert diese CRDs
kubectl get crd | grep fluxcd
gitrepositories.source.toolkit.fluxcd.io
kustomizations.kustomize.toolkit.fluxcd.io
helmrepositories.source.toolkit.fluxcd.io
helmreleases.helm.toolkit.fluxcd.io

5.6 Controller-Konfiguration

5.6.1 Reconciliation-Verhalten anpassen

ArgoCD - Sync Policy:

syncPolicy:
  automated:
    selfHeal: true       # Automatische Drift-Korrektur
    prune: true          # Lösche nicht-deklarierte Ressourcen
  syncOptions:
    - CreateNamespace=true
    - PruneLast=true
  retry:
    limit: 5
    backoff:
      duration: 5s
      factor: 2
      maxDuration: 3m

Flux - Kustomization Options:

spec:
  interval: 30s         # Sehr häufige Reconciliation
  retryInterval: 2m     # Bei Fehlern alle 2 Minuten wiederholen
  timeout: 5m           # Timeout für Apply-Operationen
  force: true           # Überschreibt lokale Änderungen
  prune: true           # Entfernt nicht-deklarierte Ressourcen
  wait: true            # Wartet auf Rollout-Completion

5.7 Controller-Observability

5.7.1 Health Checks

ArgoCD Application Health:

# CLI Status check
argocd app get my-app
argocd app sync my-app

# Kubectl direkter Zugriff
kubectl get application my-app -o yaml

Flux Kustomization Status:

# Flux CLI
flux get kustomizations
flux reconcile kustomization my-app

# Kubectl Status
kubectl get kustomization my-app -o yaml | grep -A 10 status

5.7.2 Metriken sammeln

ArgoCD Metrics:

# Sync Status
argocd_app_info{sync_status="OutOfSync"}

# Controller Performance
argocd_app_reconcile_duration_seconds

Flux Metrics:

# Reconciliation Status
flux_reconcile_condition{type="Ready",status="False"}

# Controller Performance  
flux_reconcile_duration_seconds

5.8 Troubleshooting Controller

5.8.1 Häufige Probleme

Problem Symptom Lösung
RBAC-Fehler forbidden: cannot get deployments ServiceAccount Permissions prüfen
Git Access authentication failed SSH Keys/Tokens validieren
Resource Conflicts field is immutable Force-Reconciliation oder Replace
Timeout context deadline exceeded Timeout-Werte erhöhen

5.8.2 Debug-Commands

ArgoCD:

# Application Details
argocd app get my-app --show-params --show-operation

# Controller Logs
kubectl logs -n argocd deployment/argocd-application-controller -f

# Repo Server Logs  
kubectl logs -n argocd deployment/argocd-repo-server -f

Flux:

# Kustomization Details
flux get kustomization my-app --status-selector ready=false

# Controller Logs
kubectl logs -n flux-system deployment/kustomize-controller -f

# Source Controller Logs
kubectl logs -n flux-system deployment/source-controller -f

5.9 Controller-Performance

5.9.1 Skalierung

ArgoCD Application Limits: - Standard: ~100 Applications pro Controller - Mit Tuning: ~1000 Applications - Multi-Controller: Horizontal scaling möglich

Flux Controller Limits: - Kustomizations: Praktisch unbegrenzt - Git Repositories: ~100 pro Source Controller - Memory: Wächst linear mit Repository-Größe

5.9.2 Optimierung

ArgoCD Performance Tuning:

# argocd-cm ConfigMap
data:
  timeout.reconciliation: 180s
  timeout.hard.reconciliation: 0s
  application.resyncPeriod: 180s

Flux Resource Limits:

# kustomize-controller Resource Limits
resources:
  limits:
    memory: 1Gi
    cpu: 1000m
  requests:
    memory: 64Mi
    cpu: 100m

5.10 Controller vs. Operator

Aspekt Controller Operator
Zweck Verwaltet Standard-Ressourcen Verwaltet komplexe Anwendungen
Logik Einfache Reconciliation Anwendungs-spezifische Logik
Beispiel ArgoCD, Flux Prometheus Operator, MySQL Operator
CRDs Wenige, generische Viele, spezifische

5.11 Multi-Tenancy

5.11.1 ArgoCD Projects

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
spec:
  destinations:
  - namespace: team-a-*
    server: https://kubernetes.default.svc
  sourceRepos:
  - https://github.com/team-a/*
  roles:
  - name: developers
    policies:
    - p, proj:team-a:developers, applications, sync, team-a/*, allow

5.11.2 Flux Multi-Tenancy

# Namespace-basierte Trennung
kubectl create namespace team-a
kubectl create namespace team-b

# Separate Kustomizations pro Team
flux create kustomization team-a --source=team-a-repo --path=./k8s --target-namespace=team-a
flux create kustomization team-b --source=team-b-repo --path=./k8s --target-namespace=team-b