Scheduling (Управление планированием)
Jump to navigation
Jump to search
Этот раздел посвящен работе kube-scheduler и механизмам, которые определяют, на какой именно воркер попадет ваш под.
1. Прямое назначение ноды (Node Name & Selector)
Самые простые способы привязать под к конкретному серверу:
- nodeName: Самый жесткий способ. Вы указываете точное имя ноды в манифесте. Позволяет обойти (bypass) планировщик.
- Минус: Если нода упадет, под не переедет на другую, а останется в статусе
Pending.
- Минус: Если нода упадет, под не переедет на другую, а останется в статусе
- nodeSelector: Вы указываете метку (label), которой должна обладать нода.
- Пример: Запуск пода только на серверах с SSD или GPU (
disktype: ssd).
- Пример: Запуск пода только на серверах с SSD или GPU (
2. Taints и Tolerations (Защита нод)
Механизм "запрета" размещения. Позволяет ноде "отталкивать" поды, если у них нет специального "разрешения".
- Taint (Налет/Запрет): Накладывается на ноду. Состоит из
key=value:effect. - Toleration (Толерантность): Накладывается на под. Позволяет поду игнорировать Taint и запускаться на этой ноде.
Эффекты (Effects):
- NoSchedule: Новые поды без допуска не будут планироваться на ноду.
- PreferNoSchedule: Мягкий запрет — планировщик постарается не ставить под сюда, но если места больше нет, поставит.
- 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-инженера:
- Если нужно выбрать ноду для пода — используй Affinity.
- Если нужно защитить ноду от чужих подов — используй Taints.
- Для системных агентов всегда используй DaemonSet.
- Помни, что Tolerations не заставляют под идти на конкретную ноду, они лишь позволяют ему там находиться. Чтобы заставить его туда пойти, комбинируй это с Node Affinity.