Veröffentlicht am

Kubernetes Notfallplan: Production-Ausfall vermeiden

Teilen:
Authors

Kubernetes Production-Ausfall: Warum Ihr einzelner Admin um 3 Uhr nachts nicht reicht

Es ist 3:07 Uhr. Ihr Monitoring schlaegt an: Production-Cluster unreachable. Der einzige Mensch, der Ihren Kubernetes-Cluster versteht, schlaeft. Sein Telefon ist auf lautlos. Oder er ist krank. Oder im Urlaub.

Dieses Szenario ist keine Uebertreibung. Es ist Alltag im deutschen Mittelstand, wo Kubernetes-Betrieb oft an einer einzelnen Person haengt. Dieser Artikel zeigt, warum das ein inakzeptables Risiko ist - und was Sie dagegen tun koennen.

TL;DR

  • 68% der Kubernetes-Ausfaelle passieren ausserhalb der Geschaeftszeiten
  • Ein einzelner Admin erreicht bestenfalls eine MTTR von 90+ Minuten (nachts deutlich mehr)
  • Ein eingespieltes Team mit Runbooks schafft eine MTTR von 15-30 Minuten
  • Jede Stunde Downtime kostet mittelstaendische Unternehmen durchschnittlich 8.000-25.000 EUR
  • Ein dokumentierter Notfallplan mit Eskalationsprozeduren ist keine Kuer, sondern Pflicht

Die Realitaet: Wann Ausfaelle passieren

Ausfallstatistiken nach Tageszeit

Verteilung von Kubernetes-Incidents nach Tageszeit:

00:00 - 06:00  ████████████████████  32%Nacht
06:00 - 09:00  ██████████            16%Frueh
09:00 - 17:00  ██████                10%Geschaeftszeiten
17:00 - 20:00  ████████████          20%Abend
20:00 - 00:00  ██████████████        22%Spaetabend

68% aller Incidents: Ausserhalb der Geschaeftszeiten

Haeufigste Ursachen:
├── Certificate Expiry (nachts, Cronjob-Timing):     18%
├── Node Resource Exhaustion (Memory Leak ueber Nacht): 22%
├── Failed Auto-Scaling (Traffic-Spikes):             15%
├── etcd Disk Full / Compaction Issues:               12%
├── Failed Deployments (Rollout haengt):              14%
├── Network/DNS Issues:                                9%
└── Sonstige:                                         10%

Die meisten dieser Incidents treten auf, weil naechtliche Batch-Jobs, Log-Akkumulation oder Memory Leaks ueber Stunden wachsen und erst nachts kritisch werden.


Das Single-Admin-Problem

Was bei einem Ausfall um 3 Uhr nachts passiert

Betrachten wir den realistischen Ablauf, wenn Ihr einzelner Admin nachts aus dem Schlaf gerissen wird.

03:07  Alert: Production Cluster - Multiple Pods CrashLoopBackOff
03:07  PagerDuty/SMS an AdminHandy klingelt
03:12  Admin wacht auf, liest Alert (5 Min Aufwachzeit)
03:15  Admin steht auf, geht zum Laptop, VPN-Verbindung
03:22  Erster kubectl-BefehlUeberblick verschaffen
03:30  Root Cause noch unklar, prueft Logs
03:45  "Ah, etcd meldet disk full"
03:50  Google: "etcd disk full kubernetes recovery"
04:05  Loesung gefunden, beginnt mit Cleanup
04:15  etcd Compaction laeuft, Cluster erholt sich
04:25  Alle Pods wieder Running
04:30  Kurze Pruefung, alles stabil
04:35  Admin geht zurueck ins Bett
──────────────────────────────────────────────────
Downtime:   ~78 Minuten
MTTR:       ~78 Minuten
Schlafverlust: komplette Nacht (einschlafen nach Adrenalin)
Naechster Tag: Admin ist muede, weniger produktiv

Was mit einem eingespielten Team und Runbook passiert

03:07  Alert: Production Cluster - Multiple Pods CrashLoopBackOff
03:07  Automatisch an On-Call-Engineer (ist wach, Nachtschicht)
03:08  Engineer oeffnet Runbook "CrashLoopBackOff Triage"
03:10  Runbook Step 1: Cluster-Zustand pruefen
03:12  Runbook Step 2: etcd Health Check → disk usage 98%
03:13  Runbook Step 3: etcd Compaction ausfuehren (Befehl im Runbook)
03:18  Compaction abgeschlossen, Cluster erholt sich
03:22  Alle Pods wieder Running
03:25  Incident dokumentiert, Post-Mortem-Ticket erstellt
──────────────────────────────────────────────────
Downtime:   ~15 Minuten
MTTR:       ~15 Minuten
Impact:     Minimal, naechster Tag normaler Betrieb

Faktor 5x schneller - nicht weil der Team-Engineer besser ist, sondern weil Runbooks und Prozesse die Denkarbeit uebernehmen.


MTTR: Die Kennzahl die Ihr Management kennen sollte

Was ist MTTR?

MTTR (Mean Time To Recovery) misst die durchschnittliche Zeit vom Auftreten eines Incidents bis zur vollstaendigen Wiederherstellung.

Incident-Timeline:

Erkennung     Reaktion    Diagnose    Fix      Verification
    |             |           |         |            |
    v             v           v         v            v
[Detection]---[Response]---[Diagnose]---[Repair]---[Verify]
    |                                                |
    └──────────── MTTR ──────────────────────────────┘

MTTR-Vergleich nach Setup

SetupMTTR (tagsüber)MTTR (nachts)MTTR (Wochenende)
1 Admin, keine Runbooks45-90 Min90-180 Min120-240 Min
1 Admin, mit Runbooks30-60 Min60-120 Min60-120 Min
3-Personen-Team, Runbooks15-30 Min15-30 Min15-30 Min
Managed Service, 24/710-20 Min10-20 Min10-20 Min

Die Differenz zwischen Nacht und Tag verschwindet nur bei einem Team mit On-Call-Rotation oder einem Managed Service.

Was MTTR kostet

Downtime-Kosten nach Unternehmensgroesse (pro Stunde):

Mittelstaendler 300 MA:
├── Umsatzausfall (Online):          3.000 - 8.000 EUR
├── Produktivitaetsverlust:          2.000 - 5.000 EUR
├── SLA-Verletzungen (B2B):         1.000 - 5.000 EUR
└── Reputationsschaden:             nicht bezifferbar
──────────────────────────────────────────────────
GESAMT pro Stunde:                  6.000 - 18.000 EUR

Mittelstaendler 700 MA:
├── Umsatzausfall (Online):          8.000 - 15.000 EUR
├── Produktivitaetsverlust:          5.000 - 10.000 EUR
├── SLA-Verletzungen (B2B):         3.000 - 8.000 EUR
└── Reputationsschaden:             nicht bezifferbar
──────────────────────────────────────────────────
GESAMT pro Stunde:                 16.000 - 33.000 EUR

Beispielrechnung:
1 Ausfall nachts, Single Admin, MTTR 120 Min = 2 Stunden
300 MA Unternehmen: 12.000 - 36.000 EUR Schaden
700 MA Unternehmen: 32.000 - 66.000 EUR Schaden

Runbook-Beispiele fuer die haeufigsten Ausfaelle

Runbook 1: CrashLoopBackOff Triage

#!/bin/bash
# runbook-crashloop-triage.sh
# Severity: P1 wenn >5 Pods betroffen, sonst P2

echo "=== STEP 1: Betroffene Pods identifizieren ==="
kubectl get pods -A --field-selector=status.phase!=Running \
  | grep -v Completed

echo ""
echo "=== STEP 2: Events pruefen ==="
# Ersetzen Sie NAMESPACE und POD_NAME
kubectl describe pod POD_NAME -n NAMESPACE | tail -20

echo ""
echo "=== STEP 3: Logs pruefen ==="
kubectl logs POD_NAME -n NAMESPACE --previous --tail=50

echo ""
echo "=== STEP 4: Haeufige Ursachen pruefen ==="
echo "--- Node Resources ---"
kubectl top nodes
echo ""
echo "--- Disk Usage auf Nodes ---"
kubectl get nodes -o json | \
  jq '.items[] | {name: .metadata.name, disk: .status.conditions[] | select(.type=="DiskPressure")}'

echo ""
echo "=== STEP 5: Entscheidungsbaum ==="
echo "OOMKilled?     → Resource Limits erhoehen"
echo "ImagePull?     → Registry-Zugang pruefen"
echo "Config Error?  → ConfigMap/Secret pruefen"
echo "Dependency?    → Upstream-Service pruefen"
echo "Disk Full?     → etcd Compaction / Log Rotation"

Runbook 2: Node NotReady Recovery

#!/bin/bash
# runbook-node-notready.sh
# Severity: P1 wenn >50% Nodes betroffen, sonst P2

echo "=== STEP 1: Node-Status ==="
kubectl get nodes -o wide

echo "=== STEP 2: Conditions pruefen ==="
kubectl describe node NODE_NAME | grep -A 5 "Conditions:"

echo "=== STEP 3: kubelet pruefen (SSH zum Node) ==="
# systemctl status kubelet
# journalctl -u kubelet --since '30 min ago' --no-pager | tail -50

echo "=== STEP 4: Recovery ==="
echo "Option A: systemctl restart kubelet"
echo "Option B: kubectl drain NODE_NAME --ignore-daemonsets && reboot"
echo "Option C: kubectl delete node NODE_NAME (Cloud Auto-Replace)"

Runbook 3: etcd Disk Full Recovery

#!/bin/bash
# runbook-etcd-recovery.sh
# Severity: P1 - Kritisch, nur von erfahrenem Engineer ausfuehren
# Symptome: Pods in Pending, kubectl timeout, "database space exceeded"

ETCD_OPTS="--cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key"

echo "=== STEP 1: etcd Status pruefen ==="
kubectl -n kube-system exec etcd-master-01 -- \
  etcdctl endpoint status --write-out=table $ETCD_OPTS

echo "=== STEP 2: Compaction ausfuehren ==="
REV=$(kubectl -n kube-system exec etcd-master-01 -- \
  etcdctl endpoint status --write-out=json $ETCD_OPTS \
  | python3 -c "import json,sys; print(json.load(sys.stdin)[0]['Status']['header']['revision'])")
kubectl -n kube-system exec etcd-master-01 -- \
  etcdctl compact $REV $ETCD_OPTS

echo "=== STEP 3: Defrag + Alarm Reset ==="
kubectl -n kube-system exec etcd-master-01 -- etcdctl defrag $ETCD_OPTS
kubectl -n kube-system exec etcd-master-01 -- etcdctl alarm disarm $ETCD_OPTS

echo "=== STEP 4: Verification ==="
echo "kubectl get pods -A        → Pods starten wieder?"
echo "kubectl get nodes           → Alle Nodes Ready?"
echo "etcdctl endpoint health     → healthy: true?"

echo "=== Prevention ==="
echo "- etcd Auto-Compaction: --auto-compaction-retention=1"
echo "- Monitoring auf DB Size (Alert bei 70%)"
echo "- Regelmaessige etcd Snapshots via CronJob"

Der Eskalationsprozess: Vom Alert zur Loesung

Eskalationsmatrix

Eskalationsstufen:

Level 1 - Automatisierung (0-5 Minuten)
├── Auto-Restart crashed Pods (Kubernetes default)
├── Auto-Scaling bei Resource Pressure
├── Auto-Failover bei Node-Ausfall
└── Trigger: Automatisch durch Kubernetes

Level 2 - On-Call Engineer (5-15 Minuten)
├── Alert-Bestätigung und Triage
├── Runbook-basierte Diagnose
├── Standard-Recovery-Massnahmen
└── Trigger: Alert nicht auto-resolved nach 5 Min

Level 3 - Team Escalation (15-30 Minuten)
├── Zweiter Engineer wird hinzugezogen
├── Parallele Diagnose (divide and conquer)
├── Kommunikation an Stakeholder
└── Trigger: L2 nach 15 Min nicht geloest

Level 4 - Management + Externe Hilfe (30-60 Minuten)
├── CTO/IT-Leiter informiert
├── Externer Support kontaktiert (Cloud Provider, Vendor)
├── Business-Impact-Bewertung
└── Trigger: L3 nach 30 Min nicht geloest

Alerting-Konfiguration fuer Production

# prometheus-alerting-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: kubernetes-production-alerts
  namespace: monitoring
spec:
  groups:
  - name: kubernetes.critical
    rules:
    - alert: KubernetesNodeNotReady
      expr: kube_node_status_condition{condition="Ready",status="true"} == 0
      for: 2m
      labels:
        severity: critical
        team: platform
      annotations:
        summary: "Node {{ $labels.node }} ist NotReady seit 2 Min"
        runbook_url: "https://wiki.internal/runbooks/node-notready"

    - alert: KubernetesPodCrashLooping
      expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 15 > 5
      for: 5m
      labels:
        severity: critical
        team: platform
      annotations:
        summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} CrashLoop"
        runbook_url: "https://wiki.internal/runbooks/crashloop-triage"

Was ein einzelner Admin NICHT leisten kann

Die Mathematik der Verfuegbarkeit

Ein einzelner Admin (Mo-Fr, 9-17 Uhr):
313 Arbeitstage x 8h = 2.504 erreichbare Stunden
Von 8.760 Stunden im Jahr = 28,6% Verfuegbarkeit

Fuer 99,9% SLA erlaubt: 8,76h Downtime/Jahr
Ein Admin mit 71,4% Nicht-Erreichbarkeit
kann 99,9% mathematisch nicht garantieren.

Die menschliche Komponente

Ein Admin der um 3 Uhr geweckt wird, hat eine um 30-50% reduzierte kognitive Leistung. Studien aus dem Incident Management zeigen: Die Fehlerrate zwischen 0 und 6 Uhr morgens liegt beim 2,7-fachen des Tageswerts. Ein mueder Admin macht also fast 3x so viele Fehler - genau dann, wenn die Situation am kritischsten ist.

Dazu kommt: 11 Stunden Ruhezeit nach Nachtarbeit (arbeitsrechtlich vorgeschrieben), reduzierte Produktivitaet am Folgetag und langfristig Burnout-Risiko bei regelmaessiger Rufbereitschaft.


Der Notfallplan: Minimum fuer jeden Mittelstaendler

Was Sie HEUTE umsetzen koennen

Auch wenn Sie kurzfristig kein Team aufbauen oder Managed Service buchen: Diese Massnahmen reduzieren Ihr Risiko sofort.

1. Runbooks schreiben (Top 5 Incidents)

Dokumentieren Sie die Loesung fuer Ihre 5 haeufigsten Probleme so, dass auch ein weniger erfahrener Kollege sie ausfuehren kann.

2. Alerting einrichten

Stellen Sie sicher, dass Alerts nicht nur per E-Mail kommen, sondern auch per SMS/Anruf den richtigen Menschen erreichen.

3. Zweite Person schulen

Mindestens eine zweite Person sollte grundlegende kubectl-Befehle kennen und wissen, wo die Runbooks liegen.

4. Backup-Kontakt definieren

Fuer den Fall, dass der Admin nicht erreichbar ist, muss klar sein, wen man anruft. Das kann ein externer Dienstleister sein, der als Backup dient.

5. Regelmaessig testen

Ein Notfallplan der nie getestet wurde, ist kein Notfallplan. Fuehren Sie vierteljaehrlich einen Incident-Drill durch: Kuenstlichen Incident in der Staging-Umgebung erzeugen (kubectl delete pod -l app=critical-service -n staging), messen wie lange Alert, Reaktion und Recovery dauern, anschliessend Retrospektive.


Managed Service als Notfallnetz

Wenn ein vollstaendiger Managed Service (ab ca. 4.000 EUR/Monat) nicht in Frage kommt, gibt es Zwischenloesungen:

OptionLeistungAb Preis/Monat
Managed On-CallIhr Admin tagsueber, Managed Service nachts + Wochenende1.500 EUR
Incident-Response RetainerGarantierte Reaktionszeit, X Incidents/Quartal inkl.800 EUR
Vollstaendiger Managed Service24/7 Betrieb, Monitoring, Incident Response4.000 EUR

Die Managed-On-Call-Option ist fuer viele Mittelstaendler der pragmatische Einstieg.


Fazit

Ein Kubernetes Production Ausfall im Mittelstand trifft fast immer zur schlechtesten Zeit. Nachts, am Wochenende, im Urlaub des Admins. Die Frage ist nicht ob, sondern wann.

Was Sie mitnehmen sollten:

  • Ein einzelner Admin ist ein Single Point of Failure - fuer Ihr gesamtes Production-System
  • MTTR ist die entscheidende Kennzahl: 15 Minuten vs. 2+ Stunden macht bei Downtime-Kosten den Unterschied
  • Runbooks sind der einfachste Hebel, um MTTR sofort zu verbessern
  • Eskalationsprozesse muessen definiert, dokumentiert und getestet sein
  • 24/7-Abdeckung ist mit einer Person nicht leistbar - weder technisch noch menschlich

Der erste Schritt ist kein teures Projekt. Es ist eine ehrliche Bestandsaufnahme: Was passiert, wenn Ihr Admin um 3 Uhr nachts nicht ans Telefon geht?


Verwandte Artikel


Sie moechten wissen, wie gut Ihr Notfallplan wirklich ist? Wir machen einen kostenlosen Incident-Readiness-Check fuer Ihren Kubernetes-Cluster. Termin vereinbaren.

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