Cheveo Cheatsheet

OOMKilled Cheatsheet

12 kubectl-Befehle für Diagnose und Right-Sizing - mit Runtime-Limits für JVM, Node, Go und Python. Drucktauglich, kostenfrei, ohne Anmeldung.

Blog-Artikel lesen →

Der Workflow

1 Bestätigen
2 Messen
3 Vergleichen
4 Fixen
5 Verifizieren

Bestätigen

1

Reason & Exit-Code

kubectl describe pod <name> | grep -A 5 "Last State"

→ Zeigt Reason (OOMKilled), Exit-Code (137) und Timestamp des letzten Crashs.

2

Reason aus JSON

kubectl get pod <name> -o jsonpath='{.status.containerStatuses[*].lastState.terminated.reason}'

→ Ein-Zeilen-Output, ideal für Skripte und Alerts.

3

Cluster-weite OOMs

kubectl get events -A --field-selector reason=OOMKilling | tail -20

→ Findet alle OOMKills im Cluster, zeitlich sortiert.

Verbrauch messen

4

Live-Verbrauch

kubectl top pod <name> --containers

→ Aktueller Memory-Verbrauch pro Container - die wichtigste Live-Zahl.

5

Top-Speicherfresser

kubectl top pods -A --sort-by=memory | head -20

→ Sortiert alle Pods cluster-weit nach Memory-Verbrauch.

6

Cgroup-Peak (v2)

kubectl exec <pod> -- cat /sys/fs/cgroup/memory.peak

→ Maximalverbrauch seit Container-Start - die einzige Zahl fürs Right-Sizing.

Limits & Requests

7

Limits anzeigen

kubectl describe pod <name> | grep -A 3 "Limits\|Requests"

→ Zeigt was wirklich im Manifest steht - oft anders als gedacht.

8

Resources strukturiert

kubectl get pod <name> -o jsonpath='{range .spec.containers[*]}{.name}: {.resources}{"\n"}{end}'

→ Saubere Übersicht über alle Container im Pod.

9

Node-Allokation

kubectl describe node <node> | grep -A 5 "Allocated resources"

→ Summierte Requests vs. Node-Kapazität - findet Node-Pressure.

Fixen & verifizieren

10

Limit setzen

kubectl set resources deployment/<name> --limits=memory=1Gi --requests=memory=512Mi

→ Schneller Patch - für GitOps natürlich im Manifest committen.

11

Rollout beobachten

kubectl rollout status deployment/<name> -w

→ Wartet bis neue Pods stabil laufen oder zeigt Fehler.

12

Unter Last validieren

kubectl top pod <name> --containers -w

→ Live-Monitor - Verbrauch unter Last sollte unter dem neuen Limit bleiben.

Runtime-Memory-Limits

Faustregel: Runtime-Heap = Container-Limit × 0,75. Der Rest ist für Stack, Native, JIT, Threads.

Runtime Setting Beispiel
Java 11+ -XX:MaxRAMPercentage=75.0 Container 1Gi → 768Mi Heap
Java (alt) -Xmx<size> -Xmx768m
Node.js --max-old-space-size=<MB> --max-old-space-size=768
Go 1.19+ GOMEMLIMIT GOMEMLIMIT=900MiB
Python resource.setrlimit(RLIMIT_AS, ...) im Init-Code

Schnelle Entscheidungen

Reason: OOMKilled, Peak ≈ Limit
→ Limit messen & 30% drauf
Verbrauch wächst über Tage
→ Memory-Leak im Code
Mehrere Pods OOM gleichzeitig
→ Node-Pressure prüfen
JVM/Node/Go Container
→ Runtime-Heap setzen
Heap-Dump < Container-Verbrauch
→ Off-Heap / Native Memory
1-Tag Intensiv-Workshop

Kubernetes Debugging - systematisch statt raten

Echte Production-Incidents nachstellen, kubectl-Workflows verinnerlichen, Root-Causes in Minuten finden.

Workshop-Details ansehen