🟣Taint — это метка на ноде, которая сразу отсекает неподходящие поды при планировании.
Формат taint:
key=value:effectНавесить taint на ноду
kubectl taint nodes node1 gpu=true:NoSchedule
Снять taint (добавить - в конец):
kubectl taint nodes node1 gpu=true:NoSchedule-
Три эффекта (effect)
—
NoSchedule — планировщик не будет размещать новые поды без нужного toleration. Уже запущенные поды остаются.—
PreferNoSchedule — мягкий запрет: планировщик постарается избежать этой ноды, но если других вариантов нет — разместит.—
NoExecute — самый жёсткий: новые поды не планируются, а уже запущенные без toleration вытесняются с ноды.🟣 Toleration — это правило в манифесте пода, которое разрешает ему размещаться на нодах с определённым taint.
Важно понимать: toleration не гарантирует, что под попадёт именно на эту ноду — он лишь снимает запрет.
Чтобы направить под на конкретную ноду, нужен nodeSelector или nodeAffinity.
apiVersion: v1
kind: Pod
metadata:
name: gpu-app
spec:
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: app
image: nvidia/cuda:12.0-base
Equal — ключ и значение должны совпасть.Exists — достаточно наличия ключа, значение не проверяется. Удобно, когда нужно допустить под на ноды с любым значением ключа:
tolerations:
- key: "gpu"
operator: "Exists"
effect: "NoSchedule"
Если не указать key совсем — toleration сработает для любого taint на ноде.
Проверить taints на ноде
kubectl describe node node1 | grep Taints
Taints и Tolerations — это способ жёстко сегментировать кластер: выделить ноды под GPU, CI-воркеры, stateful-нагрузки или вообще зарезервировать их для конкретной команды. В паре с nodeAffinity получаем полный контроль над тем, где именно запускаются поды.
#заметкиИнженера
