Der Descheduler ist ein optionales Add-on für Kubernetes (Projekt kubernetes-sigs/descheduler). Während der kube-scheduler Pods nur bei ihrer Erstellung platziert, räumt der Descheduler später auf: Er entfernt Pods, die inzwischen suboptimal verteilt sind, damit sie neu geplant werden.
Das Problem
Der Scheduler bindet einen neuen Pod genau einmal an einen Knoten. Danach ändert sich die Lage: Ein Knoten wird voll, andere bleiben leer, Taints oder Affinitäten kommen dazu, Pods laufen doppelt auf demselben Knoten. Ohne Gegenmaßnahme bleibt diese Schieflage dauerhaft bestehen.
So arbeitet der Descheduler
Der Descheduler läuft als separates Deployment oder CronJob und wendet konfigurierte Strategien (Plugins) an, zum Beispiel:
- DuplicatePods: verhindert, dass Pods desselben Controllers gehäuft auf einem Knoten liegen.
- LowNodeUtilization / HighNodeUtilization: gleicht die Auslastung zwischen schwach und stark genutzten Knoten aus.
- PodLifeTime: beendet Pods, die zu lange laufen.
- RemovePodsViolatingNodeTaints / NodeAffinity: entfernt Pods, deren Platzierung durch neue Taints oder Affinitäten ungültig wurde.
Der PodEvictor erzeugt für jede Aktion ein Eviction-Objekt über die Eviction API – und respektiert damit PodDisruptionBudgets. Bei gleicher Priorität beendet er zuerst BestEffort-, dann Burstable-, zuletzt Guaranteed-Pods (siehe QoS-Klassen).
Warum das funktioniert
Der Descheduler löscht den Pod nicht „für immer“: Ein Deployment oder ReplicaSet legt ihn sofort neu an, und der Scheduler platziert ihn mit frischer Sicht auf die aktuelle Knotenlage – oft auf einem anderen Knoten. Die Messwerte für die Auslastung stammen aus den cgroup-Statistiken der Knoten.
Mit kubectl lässt sich die Eviction einzelner Pods per Annotation descheduler.alpha.kubernetes.io/evict erzwingen oder unterbinden.
Verwandte Grundlagen: kube-scheduler, Eviction API, cgroup.