Quality of Service (QoS) bezeichnet in Kubernetes die Prioritätsklasse eines Pods. Beim Erstellen leitet der API-Server aus den requests und limits aller Container eine von drei Klassen ab und speichert sie in status.qosClass. Die Klasse entscheidet, welche Pods das Kubelet bei Ressourcenknappheit zuerst beendet (Eviction).

Die drei Klassen

  • Guaranteed: Jeder Container setzt für CPU und Memory identische Requests und Limits (requests == limits). Höchste Priorität – solche Pods werden zuletzt evakuiert.
  • Burstable: Mindestens ein Container hat Requests oder Limits, aber nicht alle Angaben sind identisch. Mittlere Priorität.
  • BestEffort: Kein Container setzt Requests oder Limits. Niedrigste Priorität – diese Pods werden zuerst evakuiert.

Bei Memory-Knappheit ordnet das Kubelet den Containern zusätzlich den Linux-Wert oom_score_adj zu (BestEffort am höchsten), damit der OOM-Killer zuerst die unwichtigsten Prozesse beendet.

Eviction-Reihenfolge

Steht ein Node unter Druck (Node Pressure, etwa Memory), evakuiert das Kubelet in dieser Reihenfolge: zuerst BestEffort, dann Burstable (nur Pods, die über ihren Requests verbrauchen), zuletzt Guaranteed. Die Klasse wird bei der Erstellung festgelegt, nicht bei der Eviction.

Die Klasse lässt sich mit kubectl get pod <name> -o jsonpath='{.status.qosClass}' abfragen. Wer die Einstufung steuern will, setzt Requests und Limits im Manifest oder nutzt die Admission Controller LimitRange (Defaults) und ResourceQuota (Obergrenzen) – beides zentrale Bausteine der Admission-Phase. Der Vertical Pod Autoscaler passt die Werte automatisch an und kann so die QoS-Einstufung verbessern. Auch Evictions und Statusänderungen der Pods sind im Audit-Log nachvollziehbar.