Taints и Tolerations: кого пускать на ноду
Как нода отгораживается от чужих Pod, чем отличаются NoSchedule, PreferNoSchedule и NoExecute, что писать в tolerations.
Что такое taints
Taint это пометка на ноде в формате key=value:effect. Шедулер при
выборе ноды читает её taints и сверяет с tolerations Pod. Если
хотя бы один taint не покрыт toleration-ом, нода исключается из
кандидатов. Pod на неё не сядет.
Это инверсия nodeSelector. Там pod выбирает ноду по labels, здесь нода фильтрует pods. Taint = «не пускать никого, кроме тех, кто явно сказал, что готов». Удобно для выделенных нод: GPU-пул, ноды для системных pods, isolated workload.
Taints ставит админ кластера через kubectl taint. Tolerations
пишет разработчик в spec Pod. Связка двусторонняя: админ говорит
«сюда только tier=critical», разработчик явно добавляет соответствующую
toleration к нужным workload.
Три effect-а
- NoSchedule. Жёсткий «не пускай новых». Уже работающие pods без toleration остаются на месте (taint появился после них).
- PreferNoSchedule. Мягкий «лучше не сюда». Шедулер старается не ставить, но если других нод нет, поставит.
- NoExecute. Жёсткий «выгнать и не пускать». Новые pods без
toleration не сядут. Уже работающие выселяются: taint-eviction-controller
внутри kube-controller-manager удалит их сразу или через
tolerationSeconds. Не kubelet, решение принимается в control-plane. Этим механизмом работают встроенные taintsnode.kubernetes.io/not-readyиnode.kubernetes.io/unreachable: kube-controller-manager ставит их на сбойные ноды, через 300 секунд pods эвакуируются.
Минимальный YAML toleration
spec:
tolerations:
- key: "workload"
operator: "Equal"
value: "stateful"
effect: "NoSchedule"
Поле за полем:
key. Ключ taint-а на ноде, который терпим.operator.Equal(нужно совпадение value) илиExists(любой value, value в toleration не пишется).value. Что у taint-а в правой части. Только приEqual.effect. Какой effect терпим. Пусто означает «терпим любой effect с этим key».tolerationSeconds. Только для NoExecute: сколько секунд pod остаётся на ноде после появления taint, прежде чем его выселят.
Operator: Equal vs Exists
Equal требует совпадения value. Exists ловит любой taint с
нужным key, value не нужен. Шаблон «терпи всё»:
tolerations:
- operator: "Exists"
Без key и без effect. Так делают DaemonSet (контроллер, запускающий
по одному Pod на каждой ноде) типа node-exporter или log-collector.
Им нужно сесть на каждую ноду, включая control-plane (там стоит
taint node-role.kubernetes.io/control-plane:NoSchedule).
Забыли эту toleration у системного DaemonSet, и node-exporter молча не
запускается на control-plane. Ошибки не будет, просто в DESIRED на
одну ноду меньше.
Taint ставит и снимает админ
kubectl taint nodes node-1 workload=stateful:NoSchedule
kubectl taint nodes node-1 workload- # снять
kubectl describe node node-1 | grep Taints
В кластере из одной ноды taint виден особенно наглядно: пометили узел
NoSchedule, и любой новый Pod без toleration зависает в Pending,
потому что других кандидатов у шедулера просто нет.
Что часто ломается
- Toleration пишут, но забывают что нужен ещё nodeAffinity. Без affinity pod с toleration уходит на любую другую ноду, мимо целевой dedicated-ноды. Об этом отдельный урок.
- effect не указан, value стоит. apiserver примет, но семантика сломается. Прописывай все поля явно.
- Опечатка в key или value. apiserver не заметит, шедулер просто не сматчит.
- Перепутали Equal и Exists. С Exists value не нужен, с Equal обязателен.
Связанные команды
kubectl taint nodes <name> <key>=<value>:<effect>
kubectl taint nodes <name> <key>-
kubectl describe node <name> | grep -A3 Taints
kubectl get pod <name> -o yaml | yq '.spec.tolerations'
kubectl explain pod.spec.tolerations
kubectl explain node.spec.taints
Коротко
- Taint - пометка на ноде
key=value:effect, она отсекает Pod без подходящей toleration. - Три effect-а:
NoSchedule(не пускать новых),PreferNoSchedule(по возможности не пускать),NoExecute(не пускать и выселить работающих). - Toleration в spec Pod описывается через
key,operator,value,effect;tolerationSecondsимеет смысл только приNoExecute. operator: Existsбез key и effect терпит любые taints, так живут системные DaemonSet.- Toleration только разрешает сесть на ноду. Притянуть Pod к ней она не может.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс