HAMi 项目 GPU Pod 调度流程源码走读
使用 HAMi 的过程中经常会出现 Pod 被创建出来 Pending 的问题,犹以如下两个问题为著:
- Pod UnexpectedAdmissionError
- Pod Pending
介于此,展开这部分代码的粗略走读,旨在说明调度过程中各组件的交互,以及资源的计算方式,其他细节会有所遗漏。
调度流程
看代码之前可以先看下官方文档说明,大体上比较明确:

细节上可以分为三个阶段:
-
准备阶段:图上可以看出有一些依赖条件,例如要有 Mutating Webhook、device-plugin 等等。 所以这个阶段主要分析下依赖条件的准备,只有在服务首次启动时需要。

-
Pod 调度阶段:准备过程完成之后 Pod 进入处理流程,完成调度
-
Pod 启动阶段:Pod 如何与 Node 上的 GPU 进行交互等
本文会着重分析准备阶段,主要内容为调度分析。
Pod 调度流程
- 用户发送创建 Pod 请求到 kube-apiserver
- 触发 Admission Webhook,更新 Pod 中 schedulerName
- kube-apiserver 根据 schedulerName 将请求发送给调度器处理
- 调度器处理
- 收集 Node device 信息 -- 通过 node annotation 收集,数据来自 daemonSet
hami-device-plugin定时写入 - 根据设备信息以及 Pod 的 limit 信息进行打分,选出最高分的 node
- 将 Pod 和 node 进行绑定完成绑定,进行 Pod 创建
- 收集 Node device 信息 -- 通过 node annotation 收集,数据来自 daemonSet