Scheduling (Управление планированием)

From wiki.baghirzade.pro
Jump to navigation Jump to search

Этот раздел посвящен работе kube-scheduler и механизмам, которые определяют, на какой именно воркер попадет ваш под.


1. Прямое назначение ноды (Node Name & Selector)

Самые простые способы привязать под к конкретному серверу:

  • nodeName: Самый жесткий способ. Вы указываете точное имя ноды в манифесте. Позволяет обойти (bypass) планировщик.
    • Минус: Если нода упадет, под не переедет на другую, а останется в статусе Pending.
  • nodeSelector: Вы указываете метку (label), которой должна обладать нода.
    • Пример: Запуск пода только на серверах с SSD или GPU (disktype: ssd).

2. Taints и Tolerations (Защита нод)

Механизм "запрета" размещения. Позволяет ноде "отталкивать" поды, если у них нет специального "разрешения".

  • Taint (Налет/Запрет): Накладывается на ноду. Состоит из key=value:effect.
  • Toleration (Толерантность): Накладывается на под. Позволяет поду игнорировать Taint и запускаться на этой ноде.

Эффекты (Effects):

  1. NoSchedule: Новые поды без допуска не будут планироваться на ноду.
  2. PreferNoSchedule: Мягкий запрет — планировщик постарается не ставить под сюда, но если места больше нет, поставит.
  3. NoExecute: Не только запрещает новый запуск, но и выселяет (evict) уже запущенные поды, если у них нет соответствующей толерантности.

Пример: Master-ноды по умолчанию имеют таинт node-role.kubernetes.io/master:NoSchedule, поэтому ваши обычные приложения на них не запускаются.


3. Node Affinity (Расширенный выбор нод)

Более гибкая замена nodeSelector. Позволяет использовать логические операторы (In, NotIn, Exists, DoesNotExist).

  • RequiredDuringScheduling... (Hard): Строгое правило (если ноды с меткой нет — под не запустится).
  • PreferredDuringScheduling... (Soft): Предпочтение (планировщик постарается выбрать такую ноду, но если нет — выберет другую).

4. Pod Affinity и Anti-Affinity

Правила размещения подов относительно друг друга.

  • Pod Affinity: "Запусти этот под там же, где уже запущен под X" (полезно для уменьшения сетевых задержек между фронтендом и кэшем).
  • Pod Anti-Affinity: "Никогда не запускай этот под на одной ноде с подом Y" (используется для высокой отказоустойчивости, чтобы реплики одного приложения не упали вместе с одной нодой).

5. DaemonSet (DS)

Тип контроллера, который гарантирует, что на каждой ноде (или на выбранных по меткам) запущен ровно один экземпляр пода.

  • Применение: Сбор логов (Fluentd), мониторинг (Prometheus Node Exporter), сетевые плагины (Kube-Proxy, Calico).
  • Автоматизация: Если вы добавите новую ноду в кластер, DaemonSet автоматически запустит на ней новый под.

6. Шпаргалка по командам (Cheat Sheet)

Задача Команда
Добавить метку на ноду kubectl label node <node-name> disktype=ssd
Посмотреть метки нод kubectl get nodes --show-labels
Добавить Taint на ноду kubectl taint nodes <node-name> key=value:NoSchedule
Удалить Taint с ноды kubectl taint nodes <node-name> key:NoSchedule-
Посмотреть Taints на ноде `kubectl describe node
Список DaemonSets kubectl get ds -A

💡 Резюме для DevOps-инженера:

  1. Если нужно выбрать ноду для пода — используй Affinity.
  2. Если нужно защитить ноду от чужих подов — используй Taints.
  3. Для системных агентов всегда используй DaemonSet.
  4. Помни, что Tolerations не заставляют под идти на конкретную ноду, они лишь позволяют ему там находиться. Чтобы заставить его туда пойти, комбинируй это с Node Affinity.