从零开始入门 K8s | 调度器的调度流程和算法介绍( 七 )

接着详细介绍 Scheduler Thread 阶段 , 在 Scheduler Pipeline 拿到一个等待调度的 Pod , 会从 NodeCache 里面拿到相关的 Node 执行 Filter 逻辑匹配 , 这从 NodeCache 遍历 Node 的过程有一个空间算法上的优化 , 简单可以概括为在避免过滤所有节点的同时考虑了调度的容灾取样调度 。

具体的优化算法逻辑(有兴趣的同学可以看 node_tree.go 的 Next 方法):在 NodeCache 中 , Node 是按照 zone 进行分堆 。 在 filter 阶段的时候 , 为会 NodeCache 维护一个 zondeIndex , 每 Pop 一个 Node 进行过滤 , zoneIndex 往后挪一个位置 , 然后从该 zone 的 node 列表中取一个 node 出来 。

可以看到上图纵轴有一个 nodeIndex , 每次也会自增 。 如果当前 zone 的节点无数据 , 那就会从下一个 zone 中拿数据 。 大概的流程就是 zoneIndex 从左向右 , nodeIndex 从上到下 , 保证拿到的 Node 节点是按照 zone 打散 , 从而实现避免过滤所有节点的同时考虑了节点的 az 均衡部署 。 (最新 release-v.1.17 的版本已经取消这种算法 , 为什么取消应该是没有考虑 Pod 的 prefer 和 node 的 prefer , 没有实现 Pod 的 Spec 要求)

推荐阅读