Kubernetes 源码剖析与实战
孔令飞
前腾讯云专家工程师
1500 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已更新 38 讲/共 55 讲
Kubernetes 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

36|kube-scheduler调度器源码剖析(上)

你好,我是孔令飞。
上一节课,我们学习了 kube-scheduler 应用具体是如何构建的。接下来,我们将深入探讨 kube-scheduler 的调度原理。
kube-scheduler 源码很多,要把它讲通、讲透很有挑战性。为此,我将借助两节课的时间,通过自顶向下的讲解逻辑:先为你系统介绍整体调度原理,再根据调度的先后顺序,分析调度原理中每个关键点的代码实现。
通过这种将调度原理与关联代码实现相结合的讲解方式,既能帮助你掌握 kube-scheduler 的核心实现,又能避免单纯阅读代码后难以串联整个调度逻辑的问题。

kube-scheduler 调度模型

我们跟着源码,先从最上层视角来看下 kube-scheduler 具体是如何启动调度流程的。整个 kube-scheduler 核心调度逻辑通过 sched.Run(ctx) 来启动,sched.Run() 代码如下:
// Run begins watching and scheduling. It starts scheduling and blocked until the context is done.
func (sched *Scheduler) Run(ctx context.Context) {
logger := klog.FromContext(ctx)
// 启动调度队列,调度队列会 Watch kube-apiserver,并存储待调度的 Pod
sched.SchedulingQueue.Run(logger)
// We need to start scheduleOne loop in a dedicated goroutine,
// because scheduleOne function hangs on getting the next item
// from the SchedulingQueue.
// If there are no new pods to schedule, it will be hanging there
// and if done in this goroutine it will be blocking closing
// SchedulingQueue, in effect causing a deadlock on shutdown.
// 不断轮询,执行 sched.scheduleOne 函数,sched.scheduleOne 函数会消费调度队列中待调度的 Pod,
// 执行调度流程,完成 Pod 的调度。
go wait.UntilWithContext(ctx, sched.scheduleOne, 0)
<-ctx.Done()
// 清理并释放资源
sched.SchedulingQueue.Close()
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. kube-scheduler的调度原理主要分为Policy、Informer和调度流水线三大部分,其中调度流水线包括Scheduler Thread、Wait Thread和Bind Thread阶段,每个阶段都有不同的功能和作用。 2. 调度框架是面向Kubernetes调度器的一种插件架构,通过调度框架可以灵活支持业务多样性的调度需求,同时最小化对kube-scheduler的调度实现,调度框架定义了一些扩展点,每次调度一个Pod的尝试都分为调度周期和绑定周期。 3. 调度扩展点包括过滤器和评分,过滤器用于选择符合Pod Spec描述的Nodes,评分用于从经过过滤后的Nodes进行打分和排序,调度扩展点功能描述清晰明了。 4. 调度插件分为in-tree和out-of-tree两种,in-tree插件是作为Kubernetes核心组件的一部分直接编译和交付的,而out-of-tree插件是作为独立项目开发和维护的,具有更大的灵活性和独立部署能力。 5. out-of-tree插件可以单独进行版本升级或兼容,相比之下,in-tree插件需要与Kubernetes版本保持同步,这显示了out-of-tree插件在版本管理上的灵活性和独立性。 6. 调度插件的选择和使用对于Kubernetes集群的性能和灵活性具有重要影响,开发者需要根据实际需求和版本管理考虑选择in-tree或out-of-tree插件。 7. 调度插件的灵活性和独立部署能力为Kubernetes集群的调度器提供了更多的定制化和扩展性,有助于满足不同业务场景下的调度需求。 8. `kube-scheduler`在调度时,会选定并使用一个调度策略,支持自定义调度策略,包括Scheduler Extender、Multiple schedulers和Scheduling Framework。 9. 调度策略的设置是在`scheduler.New`函数中进行,根据配置文件中的字段设置默认的调度策略,构建Extender调度策略,并创建调度策略保存在Map类型的变量中。 10. 调度器在对 Pod 进行调度时,需要首先初始化并加载`kube-scheduler`调度插件,并根据配置初始化调度策略。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 源码剖析与实战》
新⼈⾸单¥68
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部