Pod завис в Pending — прочитайте события планировщика и поставьте диагноз.
У свежераскатанного Deployment один Pod никак не встаёт. В кластере 5 узлов: 2 обычных и 3 GPU-узла с taint dedicated=gpu:NoSchedule. Ресурсы Pod и события планировщика:
resources:
requests:
cpu: "4"
memory: 8Gi
$ kubectl describe pod web-7d9f
Status: Pending
Events:
Type Reason From Message
---- ------ ---- -------
Warning FailedScheduling default-scheduler 0/5 nodes are available:
2 Insufficient cpu, 3 node(s) had untolerated taint {dedicated: gpu}.
preemption: 0/5 nodes: 2 No preemption victims, 3 Preemption not helpful.
Это нехватка ресурсов, нетерпимый taint, невыполнимый affinity или нет подходящего узла? Поставьте диагноз и предложите исправление.
Узла нет по двум причинам. 2 обычных узла отсеяны по Insufficient cpu — Pod просит 4 CPU. 3 GPU-узла закрыты нетерпимым taint dedicated=gpu; preemption не поможет — не даст CPU и не снимет taint. Решение: уменьшить request или добавить узлы; для GPU-узлов — toleration и nodeAffinity.
- ✗Винить только CPU, игнорируя половину сообщения про untolerated taint
- ✗Ждать, что preemption разместит Pod, который физически не влезает
- ✗Думать, что один toleration заставит Pod предпочесть GPU-узлы
- →Какое одно изменение позволит этому Pod встать на обычный узел?
- →Почему для GPU-узлов здесь стоит
Preemption not helpful?
Сообщение планировщика содержит две независимые причины, а не одну:
Pod, потому что у него нет подходящего toleration.
2 Insufficient cpu— 2 обычных узла не вмещают запрошенные 4 CPU.3 node(s) had untolerated taint {dedicated: gpu}— 3 GPU-узла отталкивают
Строка Preemption not helpful означает, что вытеснение чужих Pod ничего не даст: оно не добавит CPU обычным узлам и не снимет taint с GPU-узлов.
Как чинить. Чтобы встать на обычный узел — уменьшить requests.cpu или добавить ёмкость. Чтобы использовать GPU-узлы — добавить И toleration (снять барьер), И nodeAffinity (притянуть Pod именно туда), ведь один toleration не притягивает:
tolerations:
- key: dedicated
operator: Equal
value: gpu
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: accelerator
operator: In
values: ["gpu"]