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
Jeder GitOps-Controller arbeitet in einem endlosen Zyklus:
| Controller | Standard-Intervall | Konfigurierbar |
|---|---|---|
| ArgoCD | 3 Minuten | timeout.reconciliation |
| Flux | 1 Minute | spec.interval |
| Jenkins X | 2 Minuten | Pipeline-abhängig |
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 RessourcenFunktionsweise: 1. Pollt Git Repository alle 3
Minuten 2. Vergleicht Git-Manifeste mit Cluster-Zustand 3. Wendet
Unterschiede automatisch an (wenn automated aktiviert)
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 ÄnderungenArgoCD 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-controllerFlux 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-controllerGitOps-Controller erweitern Kubernetes durch Custom Resource Definitions:
# ArgoCD installiert diese CRDs
kubectl get crd | grep argoproj
applications.argoproj.io
applicationsets.argoproj.io
appprojects.argoproj.io# 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.ioArgoCD - 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: 3mFlux - 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-CompletionArgoCD Application Health:
# CLI Status check
argocd app get my-app
argocd app sync my-app
# Kubectl direkter Zugriff
kubectl get application my-app -o yamlFlux Kustomization Status:
# Flux CLI
flux get kustomizations
flux reconcile kustomization my-app
# Kubectl Status
kubectl get kustomization my-app -o yaml | grep -A 10 statusArgoCD 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
| 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 |
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 -fFlux:
# 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 -fArgoCD 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
ArgoCD Performance Tuning:
# argocd-cm ConfigMap
data:
timeout.reconciliation: 180s
timeout.hard.reconciliation: 0s
application.resyncPeriod: 180sFlux Resource Limits:
# kustomize-controller Resource Limits
resources:
limits:
memory: 1Gi
cpu: 1000m
requests:
memory: 64Mi
cpu: 100m| 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 |
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# 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