2015-03-04 4 views
25

Как работает планировщик Кубернетеса? Я имею в виду, что планировщик Кубернеса выглядит очень простым?Как работает планировщик Кубернеса?

Моя первоначальная мысль заключается в том, что этот планировщик представляет собой просто простую систему управления допуском, а не настоящий планировщик. Правильно ли это?

я нашел краткое описание, но это не очень информативно:

kubernetes планировщик является топология, известно, функция рабочей нагрузки конкретной политики, богатые, что существенно влияет на доступность, производительность и вместимость. Планировщику необходимо учесть требования к персональным и коллективным ресурсам, качество обслуживания требования, аппаратное/программное обеспечение/ограничения политики, аффинность и характеристики анти-аффинити, локализация данных, межремонтная нагрузка интерференция, сроки и т. Д. Требования к рабочей нагрузке будут отображаться через API по мере необходимости.

ответ

39

В приведенном вами параграфе описывается, где мы надеемся быть в будущем (где будущее определяется в единицах месяцев, а не лет). Мы еще не там, но у планировщика уже есть ряд полезных функций, достаточно для простого развертывания. В оставшейся части этого ответа я объясню, как работает планировщик сегодня.

Планировщик - это не только контроллер допуска; для каждого созданного контейнера он находит «лучшую» машину для этого контейнера, и если ни одна машина не подходит, контейнер остается незапланированным до тех пор, пока машина не станет подходящей.

Планировщик настраивается. Он имеет два типа политик: 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.

+0

Я думаю, что что-то не так со старым доком. Kuber использует 'request' для планирования и ограничения на ограничение ресурсов. – harryz

+0

@DavidO Есть ли публичная документация, которая описывает функции Fit Predicates и Priority по умолчанию, которые находятся на месте, простым английским вместо кода? Было бы полезно объяснить некубернитам и принять проектные решения. – alph486

+4

Итак, через два года вы достигли намеченной цели, которую вы упомянули в начале вашего ответа? –

5

Мы выполнили настройки, которые, например, применяют многоуровневое сродство и анти-сродство на основе пользовательских селекторов. Планировщик не идеален, но он хорош для большинства рабочих нагрузок на уровне обслуживания, и в будущем он должен стать намного лучше. https://docs.openshift.org/latest/admin_guide/scheduler.html#use-cases описывает одну конфигурацию планировщика Kube, которая обеспечивает это.

+0

Отличный подробный ресурс на планировщике k8s! Спасибо за ссылку на документы OpenShift! – TrinitronX