← Kubernetes: планирование
6 мин · средне · Урок 5 из 7

Taints и Tolerations: кого пускать на ноду

Как нода отгораживается от чужих Pod, чем отличаются NoSchedule, PreferNoSchedule и NoExecute, что писать в tolerations.

Что такое taints

node-1 · taint workload=stateful db · с toleration node-2 · без taint web api
Toleration только снимает запрет, притянуть Pod к ноде она не может.

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-а

Минимальный YAML toleration

spec:
  tolerations:
    - key: "workload"
      operator: "Equal"
      value: "stateful"
      effect: "NoSchedule"

Поле за полем:

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, потому что других кандидатов у шедулера просто нет.

Что часто ломается

Связанные команды

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

Коротко

Прошли материал до конца? Отметьте урок пройденным.