В приведенном вами параграфе описывается, где мы надеемся быть в будущем (где будущее определяется в единицах месяцев, а не лет). Мы еще не там, но у планировщика уже есть ряд полезных функций, достаточно для простого развертывания. В оставшейся части этого ответа я объясню, как работает планировщик сегодня.
Планировщик - это не только контроллер допуска; для каждого созданного контейнера он находит «лучшую» машину для этого контейнера, и если ни одна машина не подходит, контейнер остается незапланированным до тех пор, пока машина не станет подходящей.
Планировщик настраивается. Он имеет два типа политик: FitPredicate (см. Master/pkg/scheduler/predicates.go) и PriorityFunction (см. Master/pkg/scheduler/priority.go). Я опишу их.
Обязательные правила для префиксов, например метки на узле, должны быть совместимы с селектором меток на модуле (это правило реализовано в PodSelectorMatches() в predicates.go) и сумма запрашиваемых ресурсов контейнер (ы), уже запущенный на машине, а также запрашиваемые ресурсы нового контейнера (ов), который вы планируете планировать на машине, не должны быть больше, чем емкость машины (это правило реализовано в PodFitsResources() в предикатах. обратите внимание, что «запрашиваемые ресурсы» определяются как pod.Spec.Containers [n] .Resources.Limits, и если вы запрашиваете нулевые ресурсы, то вы всегда подходите). Если какое-либо из требуемых правил не выполняется для конкретной пары (новый модуль, машина), то новый модуль не запланирован на этой машине. Если после проверки всех машин планировщик решает, что новый блок не может быть запланирован на какой-либо машине, тогда блок остается в состоянии ожидания, пока он не будет удовлетворен одной из машин.
После проверки всех машин относительно предикатов соответствия планировщик может обнаружить, что несколько машин «подходят» к контейнеру. Но, конечно, стручок может быть назначен только на одну машину. Именно там приходят функции приоритета. В основном планировщик оценивает машины, которые соответствуют всем предикатам соответствия, а затем выбирает лучший. Например, он предпочитает машину, чьи уже запущенные контейнеры потребляют наименьшие ресурсы (это реализовано в LeastRequestedPriority() в priority.go). Эта политика распространяет контейнеры (и, следовательно, контейнеры) вместо упаковки партий на одну машину, оставив другие пустыми.
Когда я сказал, что планировщик настраивается, я имею в виду, что вы можете решить во время компиляции, которые соответствуют предикатам и приоритетным функциям, которые вы хотите применить Кубернетес. В настоящее время он применяет все те, которые вы видите в predicates.go и priority.go.
Я думаю, что что-то не так со старым доком. Kuber использует 'request' для планирования и ограничения на ограничение ресурсов. – harryz
@DavidO Есть ли публичная документация, которая описывает функции Fit Predicates и Priority по умолчанию, которые находятся на месте, простым английским вместо кода? Было бы полезно объяснить некубернитам и принять проектные решения. – alph486
Итак, через два года вы достигли намеченной цели, которую вы упомянули в начале вашего ответа? –