Configuration Drift entsteht, wenn der tatsächliche Zustand im Kubernetes-Cluster vom gewünschten Zustand im Git-Repository abweicht. Das passiert häufiger als man denkt und ist nicht zwangsläufig problematisch.
Einfaches Beispiel:
# Git Repository definiert:
replicas: 3
# Cluster zeigt nach manueller Skalierung:
replicas: 5Das ist Drift. Git sagt 3 Replicas, der Cluster läuft mit 5.
Manuelle Eingriffe
kubectl scale deployment my-app --replicas=5
kubectl edit deployment my-appAutomatische Systeme - Horizontal Pod Autoscaler ändert Replica-Counts - Vertical Pod Autoscaler modifiziert Ressourcen-Limits - Service Mesh Injectors fügen Sidecars hinzu
Notfall-Eingriffe
# Hotfix während einem Incident
kubectl set image deployment/my-app container=my-app:hotfix-1.2.1Externe Controller - Cert-Manager erstellt TLS-Zertifikate - Monitoring-Agents installieren DaemonSets - Cluster-Autoscaler beeinflusst Pod-Placement
ArgoCD prüft kontinuierlich den Cluster-Zustand und zeigt drei Status-Arten:
| Status | Bedeutung | Aktion erforderlich |
|---|---|---|
| Synced | Git = Cluster | Nein |
| OutOfSync | Abweichung erkannt | Ja |
| Unknown | Prüfung fehlgeschlagen | Ja |
Flux reconciled standardmäßig alle 60 Sekunden:
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: my-app
spec:
interval: 1m
prune: true # Löscht unerwünschte Ressourcen
force: true # Überschreibt manuelle ÄnderungenArgoCD:
syncPolicy:
automated:
selfHeal: true # Korrigiert Drift automatisch
prune: true # Löscht nicht-definierte RessourcenFlux:
spec:
force: true # Überschreibt lokale Änderungen
prune: true # Entfernt Drift-RessourcenManchmal will man bestimmte Drift ignorieren:
# ArgoCD: HPA-Änderungen ignorieren
spec:
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas# Flux: Reconciliation deaktivieren
metadata:
annotations:
kustomize.toolkit.fluxcd.io/reconcile: disabled# ArgoCD Drift Detection
argocd_app_info{sync_status="OutOfSync"}
# Flux Reconciliation Failures
flux_reconcile_condition{type="Ready",status="False"}
groups:
- name: gitops-drift
rules:
- alert: ConfigurationDrift
expr: argocd_app_info{sync_status="OutOfSync"} > 0
for: 5m
annotations:
summary: "Configuration Drift erkannt"# 1. Produktions-Problem: Sofort skalieren
kubectl scale deployment critical-app --replicas=10
# 2. Drift wird erkannt (OutOfSync)
# 3. Temporär akzeptieren, später Git nachziehenEntwickler erstellt manuell einen HPA:
kubectl autoscale deployment my-app --min=2 --max=10 --cpu-percent=70Drift erkannt → HPA in Git definieren:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70Open Policy Agent kann unerwünschte manuelle Änderungen verhindern:
deny[msg] {
input.request.kind.kind == "Deployment"
input.request.operation == "UPDATE"
not input.request.userInfo.username == "system:serviceaccount:argocd:argocd-application-controller"
msg := "Manuelle Deployment-Änderungen nicht erlaubt"
}
| Typ | Beispiel | Reaktion |
|---|---|---|
| Akzeptabel | HPA ändert Replicas | Ignorieren oder formalisieren |
| Temporär | Emergency Hotfix | Kurzzeitig dulden, dann Git nachziehen |
| Problematisch | Unkoordinierte manuelle Änderungen | Sofort korrigieren |
Drift ist normal und oft sinnvoll. Der Schlüssel liegt im kontrollierten Umgang:
Ein System ohne Drift-Erkennung ist entweder perfekt konfiguriert oder blind für Änderungen. Drift-Detection macht das System transparent und kontrollierbar.