Допишите Deployment так, чтобы его Pod шли только в выделенный пул GPU-узлов.
Пул GPU-узлов помечен taint dedicated=gpu:NoSchedule, а его узлы несут метку accelerator=gpu. Приведённый Deployment сейчас нигде в этом пуле не встаёт. Добавьте ровно то, что нужно, чтобы его Pod шли ТОЛЬКО на GPU-узлы — помните, что один toleration Pod не притягивает.
spec:
template:
spec:
containers:
- name: trainer
image: "trainer:1.4"
# TODO: сделайте так, чтобы Pod шли только на GPU-узлы с taint
Добавьте недостающие tolerations и affinity. Контейнер не удаляйте.
Добавьте И то, И другое: toleration под taint, чтобы GPU-узлы перестали отталкивать Pod, и required nodeAffinity по accelerator=gpu, чтобы его притягивало только туда. Один toleration лишь разрешает GPU-узлы; без affinity Pod всё равно может встать на любой узел без taint.
- ✗Добавить только toleration и ждать, что он притянет Pod
- ✗Добавить только nodeAffinity и упереться в нетерпимый taint
NoSchedule - ✗Считать, что affinity перекрывает taint и toleration не нужен
- →Как одновременно не пускать обычные Pod на GPU-узлы?
- →Когда здесь лучше
preferredDuringSchedulingaffinity?
Обе части нужны, потому что taint и affinity ортогональны. toleration снимает барьер NoSchedule, но сам не притягивает Pod; nodeAffinity притягивает Pod к узлам с меткой accelerator=gpu. Без affinity Pod, получив toleration, всё равно мог бы встать на любой обычный узел без taint.
spec:
template:
spec:
containers:
- name: trainer
image: "trainer:1.4"
tolerations:
- key: dedicated
operator: Equal
value: gpu
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: accelerator
operator: In
values: ["gpu"]