- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes Requests und Limits richtig setzen
Falsch gesetzte Requests und Limits sind die haeufigste Ursache fuer Kubernetes-Probleme im Produktivbetrieb. Zu niedrige Requests fuehren zu Overcommitment und instabilen Nodes. Zu hohe Limits verschwenden Ressourcen und treiben Kosten hoch. Dieser Artikel zeigt, wie Sie die richtigen Werte finden.
TL;DR
- Requests bestimmen die Scheduling-Garantie -- setzen Sie sie auf den typischen Verbrauch Ihrer Anwendung (P50-P75).
- Memory Limits sollten nah an den Requests liegen (Faktor 1.0-1.5), CPU Limits koennen Sie oft weglassen.
- QoS-Klasse Guaranteed (Requests = Limits) fuer kritische Workloads, Burstable fuer den Rest.
- Nutzen Sie VerticalPodAutoscaler im Recommendation-Mode, um die richtigen Werte zu finden.
Was Requests und Limits bewirken
Pruefen Sie zuerst den aktuellen Ressourcenverbrauch eines Pods:
# Aktueller CPU/Memory-Verbrauch aller Pods im Namespace
kubectl top pods -n production
# Detailansicht mit Requests und Limits
kubectl describe node <node-name> | grep -A 5 "Allocated resources"
Jetzt die Grundlagen:
Requests sind eine Garantie. Der Scheduler platziert einen Pod nur auf einem Node, der genug freie Requests hat. Wenn ein Pod 500m CPU und 256Mi Memory anfordert, reserviert Kubernetes diese Ressourcen -- unabhaengig davon, ob der Pod sie gerade nutzt.
Limits sind eine Obergrenze. Ueberschreitet ein Container sein Memory-Limit, wird er per OOMKill beendet. Ueberschreitet er sein CPU-Limit, wird er gedrosselt (Throttling) -- aber nicht gekillt.
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: app
image: myapp:2.1
resources:
requests:
cpu: 250m # 0.25 CPU Kerne garantiert
memory: 256Mi # 256 MiB RAM garantiert
limits:
cpu: 1000m # Max 1 CPU Kern
memory: 512Mi # Max 512 MiB RAM -- darueber: OOMKill
Der entscheidende Unterschied: CPU vs. Memory
Dieser Punkt wird oft missverstanden:
| Verhalten | CPU | Memory |
|---|---|---|
| Ueber Limit | Throttling (langsamer) | OOMKill (Container stirbt) |
| Unter Request | Immer verfuegbar | Immer verfuegbar |
| Komprimierbar | Ja (teilbar) | Nein (entweder belegt oder nicht) |
| Folge von Overcommit | Langsamkeit | Instabilitaet, Eviction |
Memory ist nicht komprimierbar. Wenn ein Node keinen freien Speicher hat, muss Kubernetes Pods evicten. CPU kann hingegen geteilt werden -- Pods werden langsamer, aber es crasht nichts.
Die drei QoS-Klassen
Kubernetes weist jedem Pod automatisch eine Quality-of-Service-Klasse zu. Diese bestimmt, welche Pods bei Ressourcenknappheit zuerst evicted werden:
Guaranteed -- Hoechste Prioritaet. Requests und Limits sind identisch fuer alle Container im Pod:
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 500m # = Request
memory: 512Mi # = Request
Burstable -- Mittlere Prioritaet. Mindestens ein Container hat Requests, aber Limits weichen ab oder fehlen:
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 1000m
memory: 512Mi
BestEffort -- Niedrigste Prioritaet. Keine Requests und keine Limits gesetzt. Diese Pods werden bei Engpaessen zuerst gekillt.
Pruefen Sie die QoS-Klasse eines Pods:
kubectl get pod web-app -o jsonpath='{.status.qosClass}'
Konkrete Empfehlungen fuer die Praxis
Nach hunderten Deployments haben sich diese Faustregeln bewaehrt:
Memory: Eng setzen
Memory Requests auf den typischen Verbrauch (P50-P75 der letzten 7 Tage). Memory Limits maximal 1.5x der Requests. Grund: Ein Memory Leak soll den Pod toeten, nicht den ganzen Node.
# Typische Java-Anwendung mit 512 MiB Heap
resources:
requests:
memory: 768Mi # Heap + Metaspace + Off-Heap
limits:
memory: 1Gi # ~1.3x Request, Puffer fuer GC-Spitzen
CPU: Grosszuegiger -- oder gar kein Limit
CPU Requests auf den durchschnittlichen Verbrauch. CPU Limits sind umstritten. Viele erfahrene Teams setzen gar keine CPU Limits, weil Throttling schwer zu diagnostizieren ist und die Latenz unvorhersehbar verschlechtert.
# Option A: Mit CPU Limit
resources:
requests:
cpu: 250m
limits:
cpu: 2000m # 8x Request -- grosszuegig fuer Burst
# Option B: Ohne CPU Limit (verbreitete Praxis)
resources:
requests:
cpu: 250m
# Kein CPU Limit -- Pod kann burst, wird aber bei Contention
# proportional zu seinen Requests eingeschraenkt
Richtwerte nach Workload-Typ
| Workload | CPU Request | CPU Limit | Memory Request | Memory Limit |
|---|---|---|---|---|
| Stateless Web API | 100-500m | Optional / 2-4x | 128-512Mi | 1.2-1.5x Request |
| Java-Anwendung | 500m-1000m | Optional / 2x | 768Mi-2Gi | 1.2x Request |
| Worker / Queue Consumer | 250-500m | Optional | 256-512Mi | 1.5x Request |
| Redis / Cache | 100-250m | 500m | 256Mi-1Gi | = Request |
| PostgreSQL | 500m-2000m | 2-4x | 1-4Gi | = Request |
Die richtigen Werte finden
Raten Sie nicht -- messen Sie. Es gibt drei Methoden.
Methode 1: kubectl top und Prometheus
# Momentaufnahme
kubectl top pod -n production --sort-by=memory
# Mit Prometheus: P95 CPU der letzten 7 Tage
# PromQL:
# quantile_over_time(0.95, rate(container_cpu_usage_seconds_total{namespace="production"}[5m])[7d:1m])
Methode 2: Vertical Pod Autoscaler (VPA) im Recommendation-Mode
Der VPA analysiert den tatsaechlichen Verbrauch und gibt Empfehlungen -- ohne automatisch zu aendern:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: web-app-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
updatePolicy:
updateMode: "Off" # Nur Empfehlungen, keine automatischen Aenderungen
# Empfehlungen abrufen nach 24-48 Stunden
kubectl get vpa web-app-vpa -o jsonpath='{.status.recommendation}' | jq
Methode 3: Goldilocks
Goldilocks von Fairwinds erstellt automatisch VPA-Objekte fuer alle Deployments in einem Namespace und zeigt die Empfehlungen in einem Dashboard:
# Namespace labeln
kubectl label namespace production goldilocks.fairwinds.com/enabled=true
Typische Fehler
Fehler 1: Requests = Limits fuer alles. Das verschwendet massiv Ressourcen. Guaranteed QoS ist nur fuer wirklich kritische Pods sinnvoll (Datenbanken, Core-Services).
Fehler 2: Kein Memory Limit. Ein Memory Leak in einem Pod kann den gesamten Node destabilisieren. Setzen Sie immer ein Memory Limit.
Fehler 3: Copy-Paste aus Tutorials. Die resources-Werte aus Helm Charts und Tutorials sind Platzhalter. Messen Sie den tatsaechlichen Verbrauch Ihrer Anwendung.
Fehler 4: Requests zu niedrig, Limits zu hoch. Das fuehrt zu Overcommitment: Der Scheduler packt zu viele Pods auf einen Node, und bei Last evicted Kubernetes Pods.
LimitRange und ResourceQuota
Verhindern Sie, dass Teams ohne Requests und Limits deployen:
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: production
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
type: Container
FAQ
Sollte ich CPU Limits setzen oder weglassen?
Es kommt auf den Kontext an. Ohne CPU Limits kann ein Pod temporaer mehr CPU nutzen, was die Performance verbessert. In Shared Clusters mit vielen Teams sind CPU Limits sinnvoll, um Noisy Neighbors zu verhindern. In dedizierten Namespaces koennen Sie darauf verzichten.
Was passiert, wenn ich keine Requests setze?
Der Pod bekommt die QoS-Klasse BestEffort und wird bei Ressourcenknappheit als Erstes evicted. Ausserdem kann der Scheduler den Pod auf einen bereits ueberlasteten Node platzieren.
Wie erkenne ich CPU Throttling?
Prufen Sie die container_cpu_cfs_throttled_seconds_total Metrik in Prometheus. Ein hoher Wert bedeutet, dass der Container regelmaessig am CPU Limit gedrosselt wird. Erhoehen Sie das Limit oder entfernen Sie es.
Wie oft sollte ich Requests und Limits anpassen?
Pruefen Sie die Werte nach jedem groesseren Release und mindestens einmal pro Quartal. Traffic-Muster und Anwendungsverhalten aendern sich -- Ihre Ressourcenkonfiguration sollte das widerspiegeln.
Naechster Schritt: Aktivieren Sie den VPA im Recommendation-Mode fuer Ihre wichtigsten Deployments. Nach einer Woche haben Sie belastbare Daten, um Requests und Limits zu optimieren.
Weiterführende Artikel:
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
Resource Requests und Limits: Kubernetes-Guide
Kubernetes Resource Requests und Limits richtig setzen. CPU-Throttling, OOMKill, QoS-Klassen und LimitRange mit praktischen YAML-Beispielen erklärt.
Kubernetes Performance verdoppeln: Tuning-Anleitung
Kubernetes Performance systematisch verdoppeln: Requests und Limits tunen, HPA konfigurieren, CNI und Storage-IOPS optimieren mit YAML-Beispielen.
Kubernetes Performance Tuning: Bottlenecks finden
Kubernetes Performance optimieren: Resource Requests richtig setzen, HPA und Cluster Autoscaler konfigurieren und Bottlenecks systematisch finden.
Kubernetes Requests, Limits und QoS richtig setzen
Kubernetes Requests und Limits optimal konfigurieren, QoS-Klassen verstehen und durch Right-Sizing bis zu 25 Prozent Cloud-Kosten sparen.
ConfigMaps richtig nutzen: Kubernetes Best Practices
ConfigMaps in Kubernetes erstellen, mounten und aktualisieren: Praktische Best Practices für Volumes, Env-Vars und Hot-Reload mit Reloader.