请求nvidia.com/gpu的Kubernetes Pod无法调度问题求助
这情况我之前碰到过好几次,虽然节点已经正确识别出GPU资源(allocatable和capacity都是8),但Pod还是调度失败,大概率是几个容易忽略的配置细节或者资源问题导致的,咱们一步步来排查:
1. 先补全GPU的Requests配置
你现在只给Pod指定了CPU的Requests,但GPU的Requests是缺失的。虽然Kubernetes的默认规则是:如果只设置了Limits而没设Requests,会自动把Limits的值作为Requests使用,但部分版本的NVIDIA设备插件对这种隐式声明的GPU资源支持可能有兼容性问题。
建议直接在Pod的resources.requests里显式加上nvidia.com/gpu: 1,和Limits保持一致,修改后的Pod配置大概是这样:
resources: requests: cpu: 500m nvidia.com/gpu: 1 limits: cpu: 2 memory: 2147483648 nvidia.com/gpu: 1
修改后重新创建Pod,看看能不能正常调度。
2. 验证节点CPU/内存的实际可用量
别只盯着GPU,CPU和内存不足也会导致Pod调度失败。执行以下命令查看节点的资源使用情况:
kubectl describe node MY_NODE
重点看这两个部分:
Allocatable:确认节点的总可用CPU是否≥2(你的Pod Limits是2核)、内存是否≥2Gi(对应你设置的2147483648字节)Allocated resources:计算已分配的CPU Requests总和,确保节点剩余的CPU Requests容量≥500m;内存同理,剩余容量要能容纳Pod的内存需求(默认等于Limits的2Gi)
如果节点上已经跑了其他高资源占用的Pod,就会导致新Pod无法被调度。
3. 检查NVIDIA设备插件的运行状态
节点能识别GPU不代表设备插件工作正常,它负责把GPU资源分配给Pod,一旦插件异常,Pod就拿不到GPU资源。
先查看插件Pod的状态:
kubectl get pods -n kube-system | grep nvidia-device-plugin
确保所有相关Pod都是Running状态,没有重启或崩溃的记录。如果有异常,查看日志定位问题:
kubectl logs <nvidia-device-plugin-pod-name> -n kube-system
常见的问题比如GPU驱动版本不匹配、设备权限不足等,日志里会有明确提示。
4. 排查节点污点与Pod容忍度、亲和性规则
如果节点设置了污点,而Pod没有对应的容忍度,调度器会直接跳过这个节点。执行命令查看节点污点:
kubectl describe node MY_NODE | grep Taints
比如如果节点有nvidia.com/gpu=true:NoSchedule这类污点,你需要在Pod的配置里添加对应的tolerations:
tolerations: - key: "nvidia.com/gpu" operator: "Equal" value: "true" effect: "NoSchedule"
另外,也要检查Pod是否设置了nodeSelector或affinity规则,确保当前节点符合这些规则(比如标签匹配)。
5. 查看kube-scheduler日志找具体原因
如果上面的排查都没解决问题,直接看调度器的日志,它会告诉你Pod调度失败的精确原因。
执行命令查看调度器日志(以kubeadm部署的集群为例):
kubectl logs kube-scheduler-<你的master节点名称> -n kube-system
搜索你的Pod名称,找到类似“Failed to schedule pod: ...”的日志条目,里面会明确说明是资源不足、污点不匹配还是其他问题,这是最直接的定位方式。
内容的提问来源于stack exchange,提问作者yee379

