2015-03-04 14 views
25

Wie funktioniert Kubernetes Scheduler? Was ich meine ist, dass Kubernetes 'Scheduler sehr einfach zu sein scheint?Wie funktioniert Kubernetes Scheduler?

Mein erster Gedanke ist, dass dieser Scheduler nur ein einfaches Zugangskontrollsystem ist, kein echter Scheduler. Ist das richtig?

ich eine kurze Beschreibung gefunden, aber es ist nicht sehr informativ:

Der Kubernetes Scheduler eine Politik-reich ist, Topologie-aware, Workload-spezifische Funktion, die erhebliche Auswirkungen auf die Verfügbarkeit, Leistung und Kapazität. Der Scheduler muss individuelle und kollektive Ressourcenanforderungen, Quality of Service Anforderungen, Hardware/Software/Richtlinieneinschränkungen, Affinität und Anti-Affinität Spezifikationen, Datenlokalität, Inter-Workload Interferenz, Fristen und so weiter berücksichtigen. Workload-spezifische Anforderungen werden bei Bedarf über die API verfügbar gemacht.

Antwort

39

Der von Ihnen zitierte Absatz beschreibt, wo wir hoffen, in der Zukunft zu sein (wo die Zukunft in Einheiten von Monaten, nicht Jahren definiert wird). Wir sind noch nicht da, aber der Scheduler verfügt bereits über einige nützliche Funktionen, die für eine einfache Bereitstellung ausreichen. Im Rest dieser Antwort werde ich erklären, wie der Scheduler heute funktioniert.

Der Scheduler ist nicht nur ein Zugangscontroller; für jeden Pod, der erstellt wird, findet er die "beste" Maschine für diesen Pod, und wenn keine Maschine geeignet ist, bleibt der Pod außerplanmäßig, bis eine Maschine geeignet wird.

Der Scheduler ist konfigurierbar. Es gibt zwei Arten von Richtlinien: FitPredicate (siehe master/pkg/scheduler/pradicates.go) und PriorityFunction (siehe master/pkg/scheduler/priorities.go). Ich werde sie beschreiben.

Passende Prädikate sind erforderliche Regeln, z. B. müssen die Beschriftungen auf dem Knoten mit dem Beschriftungsselektor auf dem Pod kompatibel sein (diese Regel ist in PodSelectorMatches() in prdicates.go implementiert) und die Summe der angeforderten Ressourcen von Die Container, die bereits auf der Maschine ausgeführt werden, sowie die angeforderten Ressourcen der neuen Container, die Sie planen, auf der Maschine zu planen, dürfen nicht größer als die Kapazität der Maschine sein (diese Regel wird in PodFitsResources() in Prädikaten implementiert). gehen Sie, beachten Sie, dass "angeforderte Ressourcen" als pod.Spec.Containers [n] .Resources.Limits definiert ist, und wenn Sie keine Ressourcen anfordern, dann passen Sie immer). Wenn eine der erforderlichen Regeln für ein bestimmtes (neues Pod, Computer) -Paar nicht erfüllt ist, wird der neue Pod nicht auf diesem Computer geplant. Wenn der Scheduler nach dem Überprüfen aller Maschinen entscheidet, dass der neue Pod nicht auf einer Maschine geplant werden kann, bleibt der Pod im Status Pending, bis er von einer der Maschinen erfüllt werden kann.

Nachdem alle Maschinen in Bezug auf die Anpassungsprädikate überprüft wurden, stellt der Scheduler möglicherweise fest, dass mehrere Maschinen den Pod "anpassen". Aber natürlich kann der Pod nur auf einer Maschine geplant werden. Hier kommen Prioritätsfunktionen ins Spiel. Im Grunde klassifiziert der Scheduler die Maschinen, die alle Fit-Prädikate erfüllen, und wählt dann die beste aus. Zum Beispiel bevorzugt es die Maschine, deren bereits laufende Pods die wenigsten Ressourcen verbrauchen (dies ist in LeastRequestedPriority() in priorities.go implementiert). Diese Richtlinie verteilt Pods (und damit Container), anstatt sie auf eine Maschine zu packen, während andere leer bleiben.

Wenn ich sagte, dass der Scheduler konfigurierbar ist, meine ich, dass Sie zur Kompilierungszeit entscheiden können, welche Prädikate und Prioritätsfunktionen Sie Kubernetes anwenden möchten. Derzeit gilt es alle, die Sie in Prädikaten.go und priorities.go sehen.

+0

Ich denke, mit dem alten Doc ist etwas nicht in Ordnung. Kuber verwendet 'request', um die Ressourcen zu terminieren und zu begrenzen. – harryz

+0

@DavidO Gibt es eine öffentliche Dokumentation, die die standardmäßigen Fit Predicates und Priority-Funktionen beschreibt, die in englischer Sprache statt in Code vorhanden sind? Es wäre hilfreich, um Nicht-Kuberniten zu erklären und Designentscheidungen zu treffen. – alph486

+4

Also hast du zwei Jahre später das Ziel erreicht, das du zu Beginn deiner Antwort erwähnt hast? –

5

Wir haben Anpassungen vorgenommen, die zum Beispiel Multilevel-Affinität und Anti-Affinität basierend auf benutzerdefinierten Selektoren anwenden. Der Scheduler ist nicht perfekt, aber er ist ziemlich gut für die meisten Service-Level-Workloads und sollte in Zukunft viel besser werden. https://docs.openshift.org/latest/admin_guide/scheduler.html#use-cases beschreibt eine bestimmte Kube-Scheduler-Konfiguration, die das bereitstellt.

+0

Große detaillierte Ressource auf dem k8s Scheduler! Danke für den Link zu OpenShift docs! – TrinitronX

Verwandte Themen