- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes Configuration Drift: Erkennung und Behebung von Abweichungen
TL;DR
- Configuration Drift entsteht, wenn der tatsaechliche Cluster-Zustand von der gewuenschten Konfiguration in Git abweicht -- durch manuelle kubectl-Aenderungen, Hotfixes oder vergessene Rollbacks.
- ArgoCD erkennt Drift automatisch als "OutOfSync"-Status und kann mit
selfHeal: trueAbweichungen in Echtzeit korrigieren. - Admission Webhooks (Kyverno, OPA Gatekeeper) koennen manuelle Aenderungen blockieren und so Drift von vornherein verhindern.
kubectl diffund ArgoCD-Diff-Ansichten sind die schnellsten Werkzeuge zur manuellen Drift-Erkennung.- Prometheus-Metriken und Alerts auf Drift-Events sind essentiell fuer Compliance-Audits und Betriebssicherheit.
Was ist Configuration Drift?
Configuration Drift beschreibt den Zustand, wenn die tatsaechliche Konfiguration im Kubernetes-Cluster nicht mehr mit der gewuenschten Konfiguration in Git uebereinstimmt. Die typischen Ursachen:
1. Hotfix unter Druck:
kubectl set image deployment/api api=myregistry/api:hotfix-123
(Vergessen, das in Git nachzutragen)
2. Debugging mit kubectl edit:
kubectl edit deployment api -n production
(Resource Limits angepasst, nie zurueckgesetzt)
3. Manuelle Skalierung:
kubectl scale deployment api --replicas=10
(HPA ueberschrieben, nie zurueckgesetzt)
4. Emergency Patch:
kubectl patch configmap api-config -p '{"data":{"DEBUG":"true"}}'
(Debug-Flag vergessen auszuschalten)
Ohne systematische Erkennung akkumuliert sich Drift, bis niemand mehr weiss, was tatsaechlich im Cluster laeuft. Die Folgen: unerklaeliche Ausfaelle, fehlgeschlagene Deployments und Compliance-Verstoesse.
Drift erkennen: kubectl diff
Der einfachste Weg, Configuration Drift zu erkennen:
# Einzelnes Manifest vergleichen
kubectl diff -f deployment.yaml
# Ganzes Verzeichnis vergleichen
kubectl diff -f k8s/production/
# Kustomize-Output vergleichen
kubectl diff -k overlays/production/
# Helm Release vergleichen
helm diff upgrade mein-release ./chart \
--values values-production.yaml
ArgoCD: Automatische Drift Detection
ArgoCD vergleicht kontinuierlich den Cluster-Zustand mit dem Git-Repository. Abweichungen werden als "OutOfSync" angezeigt. Mit selfHeal: true werden sie automatisch korrigiert.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: production-api
namespace: argocd
spec:
project: production
source:
repoURL: https://github.com/meine-org/gitops-config.git
targetRevision: main
path: apps/api/overlays/production
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- Validate=true
- PruneLast=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
Fuer eine ausfuehrliche ArgoCD-Einrichtung empfehlen wir unser ArgoCD GitOps Tutorial.
Bestimmte Felder von der Drift Detection ausnehmen
Manche Felder aendern sich legitimerweise (z.B. durch HPA oder Sidecar-Injection):
spec:
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas
- group: apps
kind: Deployment
jqPathExpressions:
- .spec.template.metadata.annotations."sidecar.istio.io/status"
Drift verhindern: Admission Webhooks
Kyverno: Manuelle Aenderungen blockieren
Nur ArgoCD darf Aenderungen in Production vornehmen. Alles andere wird abgelehnt:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: block-manual-changes
spec:
validationFailureAction: Enforce
rules:
- name: block-non-gitops-changes
match:
any:
- resources:
kinds:
- Deployment
- StatefulSet
- Service
- ConfigMap
namespaces:
- production
- staging
exclude:
any:
- subjects:
- kind: ServiceAccount
name: argocd-application-controller
namespace: argocd
validate:
message: |
Manuelle Aenderungen in Production/Staging sind nicht erlaubt.
Bitte aendern Sie die Konfiguration im Git-Repository.
deny: {}
OPA Gatekeeper: Compliance-Drift erkennen
Gatekeeper prueft bestehende Ressourcen per Audit auf Compliance-Verstoesse:
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredresources
spec:
crd:
spec:
names:
kind: K8sRequiredResources
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredresources
violation[{"msg": msg}] {
container := input.review.object.spec.template.spec.containers[_]
not container.resources.limits.cpu
msg := sprintf("Container %v hat kein CPU-Limit", [container.name])
}
---
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredResources
metadata:
name: require-resource-limits
spec:
enforcementAction: warn
match:
kinds:
- apiGroups: ["apps"]
kinds: ["Deployment"]
namespaces: [production, staging]
Fuer mehr zu Policy-as-Code lesen Sie unseren Artikel zu Kubernetes Policy Automation.
Break-Glass fuer Notfaelle
Komplette Blockierung ist unrealistisch. Fuer Notfaelle brauchen Sie einen definierten Prozess:
# Notfall-Aenderung mit Dokumentation
kubectl annotate deployment api \
break-glass/approved-by="mein-name" \
break-glass/reason="incident-123" \
break-glass/timestamp="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
# Danach: Aenderung innerhalb von 24h in Git nachtragen
Drift-Monitoring mit Prometheus
ArgoCD-Metriken und Alerts
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: drift-detection-alerts
namespace: monitoring
spec:
groups:
- name: configuration-drift
rules:
- alert: ConfigurationDriftDetected
expr: argocd_app_info{sync_status="OutOfSync"} == 1
for: 10m
labels:
severity: warning
annotations:
summary: "Drift: {{ $labels.name }} ist seit 10 Min OutOfSync"
- alert: DriftRemediationFailed
expr: increase(argocd_app_sync_total{phase="Error"}[1h]) > 3
for: 5m
labels:
severity: critical
annotations:
summary: "ArgoCD konnte {{ $labels.name }} nicht synchronisieren"
- alert: ComplianceDriftDetected
expr: sum by (constraint_name) (gatekeeper_violations) > 0
for: 15m
labels:
severity: warning
annotations:
summary: "Gatekeeper-Violations fuer {{ $labels.constraint_name }}"
Drift-Notifications per Slack
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
template.drift-detected: |
message: |
*Configuration Drift detected!*
Application: {{.app.metadata.name}}
Status: {{.app.status.sync.status}}
Die Aenderung wurde automatisch zurueckgesetzt (selfHeal).
trigger.on-sync-status-unknown: |
- when: app.status.sync.status == 'OutOfSync'
send: [drift-detected]
Woechentlicher Compliance-Audit
#!/bin/bash
echo "=== Configuration Drift Audit ==="
echo "Datum: $(date -u +%Y-%m-%d)"
echo ""
echo "--- ArgoCD Application Status ---"
kubectl get applications -n argocd \
-o custom-columns=\
'NAME:.metadata.name,SYNC:.status.sync.status,HEALTH:.status.health.status'
echo ""
echo "--- OutOfSync Applications ---"
kubectl get applications -n argocd \
-o jsonpath='{range .items[?(@.status.sync.status=="OutOfSync")]}{.metadata.name}{"\n"}{end}'
echo ""
echo "--- OPA Gatekeeper Violations ---"
kubectl get constraints \
-o custom-columns='CONSTRAINT:.metadata.name,VIOLATIONS:.status.totalViolations'
Fuer mehr zu Compliance-Automation empfehlen wir unseren Guide zu Kubernetes Compliance Automation.
Best Practices auf einen Blick
| Massnahme | Wirkung | Komplexitaet |
|---|---|---|
kubectl diff in CI/CD | Drift vor Deployment erkennen | Niedrig |
ArgoCD selfHeal: true | Automatische Korrektur | Mittel |
| Kyverno Admission Webhooks | Manuelle Aenderungen blockieren | Mittel |
| Break-Glass-Prozess | Notfaelle kontrolliert ermoeglichen | Mittel |
| Prometheus Drift-Alerts | Drift sichtbar und messbar machen | Niedrig |
| RBAC Read-Only fuer Production | Drift-Risiko minimieren | Niedrig |
| Woechentlicher Audit-Report | Compliance nachweisen | Niedrig |
Fuer eine vollstaendige GitOps-Strategie lesen Sie auch unseren Artikel zur GitOps-Evolution.
Verwandte Artikel
- ArgoCD Tutorial: GitOps fuer Kubernetes einrichten
- Kubernetes Policy Automation: Compliance als Code
- Kubernetes Compliance Automation: DSGVO und BSI
- Kubernetes Config Management: ConfigMaps, Secrets und ESO
- GitOps Evolution: Trends und Best Practices
Configuration Drift ist eine der haeufigsten Ursachen fuer Ausfaelle in Kubernetes-Umgebungen. Wir helfen Ihnen, GitOps-Workflows aufzusetzen und Drift Detection zu implementieren -- Kontakt aufnehmen.
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
ArgoCD ApplicationSets: Multi-App Deployment Patterns
ArgoCD ApplicationSets automatisieren Multi-App und Multi-Cluster Deployments mit Generatoren. Praxis-Patterns für Git, Cluster und Matrix.
GitOps Repository-Struktur: Best Practices
Die richtige Repository-Struktur entscheidet über den Erfolg von GitOps. Mono-Repo vs. Multi-Repo, Verzeichnisaufbau und Environment-Promotion praxisnah erklärt.
GitOps Secrets: SOPS und Sealed Secrets im Vergleich
Secrets sicher in Git verwalten mit Sealed Secrets, Mozilla SOPS und External Secrets Operator. Praxisvergleich für GitOps-Workflows.
Multi-Cluster Management: Kubernetes-Flotten steuern
Mehrere Kubernetes-Cluster zentral verwalten mit ArgoCD ApplicationSets und Rancher Fleet. Topologien, Drift-Erkennung und praxisnahe YAML-Beispiele.
ArgoCD installieren und erstes Projekt deployen
ArgoCD auf Kubernetes installieren und das erste Projekt Schritt für Schritt deployen, von der CLI-Einrichtung bis zur automatischen Synchronisation.