Veröffentlicht am

Configuration Drift erkennen und beheben mit GitOps

Teilen:
Authors

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: true Abweichungen in Echtzeit korrigieren.
  • Admission Webhooks (Kyverno, OPA Gatekeeper) koennen manuelle Aenderungen blockieren und so Drift von vornherein verhindern.
  • kubectl diff und 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

MassnahmeWirkungKomplexitaet
kubectl diff in CI/CDDrift vor Deployment erkennenNiedrig
ArgoCD selfHeal: trueAutomatische KorrekturMittel
Kyverno Admission WebhooksManuelle Aenderungen blockierenMittel
Break-Glass-ProzessNotfaelle kontrolliert ermoeglichenMittel
Prometheus Drift-AlertsDrift sichtbar und messbar machenNiedrig
RBAC Read-Only fuer ProductionDrift-Risiko minimierenNiedrig
Woechentlicher Audit-ReportCompliance nachweisenNiedrig

Fuer eine vollstaendige GitOps-Strategie lesen Sie auch unseren Artikel zur GitOps-Evolution.


Verwandte Artikel


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