Cytowany paragraf opisuje, gdzie mamy nadzieję być w przyszłości (gdzie przyszłość definiowana jest w jednostkach miesięcy, a nie lat). Nie jesteśmy jeszcze na miejscu, ale program planujący ma już wiele użytecznych funkcji, wystarczającą do prostego wdrożenia. W pozostałej części tej odpowiedzi wyjaśnię, jak działa program planujący.
Program planujący to nie tylko kontroler dostępu; dla każdej utworzonej kapsuły znajduje się "najlepsza" maszyna do tej kapsuły, a jeśli żadna maszyna nie jest odpowiednia, kapsuła pozostaje niezaplanowana, aż maszyna stanie się odpowiednia.
Harmonogram jest konfigurowalny. Ma dwa typy polityk, FitPredicate (patrz master/pkg/scheduler/predicates.go) i PriorityFunction (patrz master/pkg/scheduler/priorities.go). Opiszę je.
Predykaty dopasowania to wymagane reguły, na przykład etykiety na węźle muszą być zgodne z selektorem etykiet na strąku (ta reguła jest zaimplementowana w PodSelectorMatches() w predicates.go), a suma żądanych zasobów Kontener (y) już uruchomione na maszynie plus wymagane zasoby nowego kontenera (ów), które planujesz, na maszynie, nie mogą być większe niż pojemność maszyny (ta reguła jest zaimplementowana w PodFitsResources() w predykatach. idź, zauważ, że "wymagane zasoby" są zdefiniowane jako pod.Spec.Containers [n] .Resources.Limits, a jeśli zażądasz zerowych zasobów, to zawsze pasujesz). Jeśli którakolwiek z wymaganych reguł nie jest spełniona dla konkretnej pary (nowego strąka, maszyny), nowy plan nie jest zaplanowany na tym komputerze. Jeśli po sprawdzeniu wszystkich maszyn planista zdecyduje, że nowej kapsuły nie można zaplanować na żadnej maszynie, to kapsuła pozostaje w stanie oczekiwania, dopóki nie zostanie spełniona przez jedną z maszyn.
Po sprawdzeniu wszystkich maszyn w odniesieniu do predykatów dopasowania, program planujący może stwierdzić, że wiele maszyn "pasuje" do bloku. Ale oczywiście kapsułę można zaplanować tylko na jednej maszynie. Tutaj pojawiają się funkcje priorytetowe. Zasadniczo scheduler plasuje maszyny, które spełniają wszystkie predykaty dopasowania, a następnie wybiera najlepszy. Na przykład preferuje maszynę, której już działające kapsuły zużywają najmniej zasobów (jest to zaimplementowane w LeastRequestedPriority() w priority.go). Ta zasada rozdziela kapsuły (a tym samym kontenery) zamiast pakować je na jeden komputer, pozostawiając inne puste.
Kiedy powiedziałem, że program planujący jest konfigurowalny, mam na myśli to, że możesz zdecydować w czasie kompilacji, które pasuje do predykatów i funkcji priorytetowych, które chcesz zastosować w Kubernetes. Obecnie dotyczy wszystkich tych, które widzisz na predicates.go i priority.go.
Myślę, że coś jest nie tak ze starym dokumentem. Kuber używa 'request' do planowania i' ograniczenia' dla ograniczenia zasobów. – harryz
@DavidO Czy istnieje publiczna dokumentacja opisująca domyślne funkcje Predykatów Dopasowanych i Priorytetów w języku angielskim zamiast kodu? Byłoby użyteczne, aby wyjaśnić non-kubernites i podejmować decyzje projektowe. – alph486
Czy dwa lata później osiągnąłeś zamierzony cel, o którym wspomniałeś na początku swojej odpowiedzi? –