聚焦目标
理解一个pod的被调度的大致流程
目录
Scheduler
在前面,我们了解了Pod调度算法的注册
和Informer机制来监听kube-apiserver上的资源变化
,今天这一讲,我们就将两者串联起来,看看在kube-scheduler中,Informer监听到资源变化后,如何用调度算法将pod进行调度。
1 | // 在运行 kube-scheduler 的初期,我们创建了一个Scheduler的数据结构,回头再看看有什么和pod调度算法相关的 |
SchedulingQueue
1 | // 在上面实例化Scheduler后,有个注册事件 Handler 的函数:addAllEventHandlers(sched, informerFactory, podInformer) |
scheduleOne
1 | // 了解入队和出队操作后,我们看一下Scheduler运行的过程 |
ScheduleResult
1 | // 调用算法下的Schedule |
Assume
1 | func (sched *Scheduler) assume(assumed *v1.Pod, host string) error { |
Bind
1 | func (sched *Scheduler) bind(ctx context.Context, prof *profile.Profile, assumed *v1.Pod, targetNode string, state *framework.CycleState) (err error) { |
Update To Etcd
1 | // 这块的代码我不做细致的逐层分析了,大家根据兴趣自行探索 |
Summary
今天这一次分享比较长,我们一起来总结一下:
- Pod的调度是通过一个队列
SchedulingQueue
异步工作的- 监听到对应pod事件后,放入队列
- 有个消费者从队列中获取pod,进行调度
- 单个pod的调度主要分为3个步骤:
- 根据Predict和Priority两个阶段,调用各自的算法插件,选择最优的Node
- Assume这个Pod被调度到对应的Node,保存到cache
- 用extender和plugins进行验证,如果通过则绑定
- 绑定成功后,将数据通过client向kube-apiserver发送,更新etcd
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili:https://space.bilibili.com/293775192
公众号:golangcoding