Документация находится в разработке, может содержать неполную информацию.
Описание алгоритма планировщика
За распределение подов по узлам отвечает планировщик Kubernetes (компонент kube-scheduler
).
Алгоритм принятия решения планировщиком разбит на 2 фазы: Filtering
и Scoring
.
В рамках каждой фазы планировщик запускает набор плагинов, которые реализуют принятие решения, например:
- ImageLocality — плагин отдает предпочтение узлам, на которых уже есть образы контейнеров, которые используются в запускаемом поде. Фаза:
Scoring
. - TaintToleration — реализует механизм taints and tolerations. Фазы:
Filtering, Scoring
. - NodePorts — проверяет, есть ли у узла свободные порты, необходимые для запуска пода. Фаза:
Filtering
.
Полный список плагинов можно посмотреть в документации Kubernetes.
В первой фазе фильтрации (Filtering
) работают filter-плагины, которые проверяют узлы на совпадение с условиями фильтров (taints, nodePorts, nodeName, unschedulable и т.д.).
Отфильтрованный список сортируется с чередованием зон, чтобы не размещать все поды в одной зоне. Предположим, что после фильтрации остались узлы, распределённые по зонам следующим образом:
Zone 1: Node 1, Node 2, Node 3, Node 4
Zone 2: Node 5, Node 6
В этом случае они будут выбираться в следующем порядке:
Node 1, Node 5, Node 2, Node 6, Node 3, Node 4
Обратите внимание, что с целью оптимизации выбираются не все попадающие под условия узлы, а только их часть. По умолчанию функция выбора количества узлов линейная. Для кластера из ≤50 узлов будут выбраны 100% узлов, для кластера из 100 узлов — 50%, а для кластера из 5000 узлов — 10%. Минимальное значение — 5% при количестве узлов более 5000. Подробнее про ограничение числа узлов можно прочесть в документации Kubernetes на ресурс KubeSchedulerConfiguration. Deckhouse использует значение по умолчанию, поэтому в очень больших кластерах нужно учитывать это поведение планировщика.
После того как выбраны узлы, подходящие под условия фильтров, запускается фаза Scoring
. Плагины этой фазы анализируют список отфильтрованных узлов и назначают оценку (score) каждому узлу. Оценки от разных плагинов суммируются. На этой фазе оцениваются доступные ресурсы на узлах, pod capacity, affinity, volume provisioning и так далее.
Результатом работы этой фазы является список узлов с максимальной оценкой. Если в списке больше одного узла, то узел выбирается случайным образом.
Документация
Изменение и расширение логики работы планировщика
Для изменения логики работы планировщика можно использовать механизм плагинов расширения.
Каждый плагин представляет собой вебхук, отвечающий следующим требованиям:
- Использование TLS.
- Доступность через сервис внутри кластера.
- Поддержка стандартных Verbs (filterVerb = filter, prioritizeVerb = prioritize).
- Также, предполагается что все подключаемые плагины могут кэшировать информацию об узле (
nodeCacheCapable: true
).
Подключить такой вебхук extender можно при помощи ресурса KubeSchedulerWebhookConfiguration.
При использовании опции failurePolicy: Fail
, ошибка в работе вебхука приводит к остановке работы планировщика и новые поды не смогут запуститься.
Ускорение восстановления при потере узла
По умолчанию, если узел в течении 40 секунд не сообщает свое состояние, он помечается как недоступный. Ещё через 5 минут поды такого узла будут назначены планировщиком на другие узлы. Итоговое время недоступности приложений составляет около 6 минут.
Для специфических задач, когда приложение не может быть запущено в нескольких экземплярах, в настройках модуля control-plane-manager
есть способ сократить период недоступности:
- Уменьшить время перехода узла в состояние
Unreachable
при потере с ним связи настройкой параметраnodeMonitorGracePeriodSeconds
. - Уменьшить таймаут переназначения узла поду в параметре
failedNodePodEvictionTimeoutSeconds
.
Пример
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: control-plane-manager
spec:
version: 1
settings:
nodeMonitorGracePeriodSeconds: 10
failedNodePodEvictionTimeoutSeconds: 50
В этом случае при потере связи с узлом приложения будут запущены на других узлах примерно через 1 минуту.
Оба описанных параметра оказывают непосредственное влияние на потребление ресурсов процессора и памяти на master-узлах. Уменьшенные таймауты заставляю системные компоненты чаще производить отправку статусов и сверку состояний ресурсов.
В процессе подбора подходящих значений обращайте внимание на графики потребления ресурсов master-узлов. Будьте готовы к тому, что для обеспечения приемлимых значений параметров может потребоваться увеличение мощностей, выделенных для master-узлов.