k8s源代码走读之Kube-Scheduler
前言
Kubernetes 源代码存放在 GitHub 上,你可以通过以下链接获取:Kubernetes GitHub 仓库。Kube-Scheduler 相关的代码位于 pkg/scheduler 和 cmd/kube-scheduler 等目录中。
- pkg/scheduler: 包含了 Kube-Scheduler 的核心逻辑,如调度算法、预选和绑定等。
- cmd/kube-scheduler: 包含 Kube-Scheduler 的入口文件,以及启动 Kube-Scheduler 所需的配置和参数。
Kube-Scheduler 的代码结构
在 pkg/scheduler 目录下,Kube-Scheduler 的代码结构主要分为以下几个模块:
- algorithm: 包含调度算法的实现,如优先级函数等。
- framework: 包含调度框架的实现,定义了调度器的各个阶段。
- plugins: 包含各种调度器插件的实现,如预选插件和绑定插件。
- stages: 包含调度器各个阶段的具体实现,如预选阶段、优选阶段等。
Kube-Scheduler 的核心逻辑
调度框架
1.1 阶段划分
- 代码位置: pkg/scheduler/framework/framework.go
- 主要功能: 定义了调度器的各个阶段,包括预选、优选等。
1.2 阶段执行
- 代码位置: pkg/scheduler/scheduler.go
- 主要功能: 调度器在执行时按照预定义的阶段顺序,依次调用每个阶段的处理逻辑。
调度算法
2.1 优先级函数
- 代码位置: pkg/scheduler/algorithm/priorities.go
- 主要功能: 定义了调度器中用于计算优先级的各种函数,影响 Pod 的调度顺序。
2.2 优选函数
- 代码位置: pkg/scheduler/algorithm/predicates.go
- 主要功能: 定义了调度器中用于筛选可行节点的各种函数,影响 Pod 的可调度性。
调度器插件
3.1 预选插件
- 代码位置: pkg/scheduler/plugins/
- 主要功能: 预选插件影响节点的可用性,决定哪些节点可以继续参与调度。
3.2 优选插件
- 代码位置: pkg/scheduler/plugins/
- 主要功能: 优选插件通过给节点打分,影响节点的优选顺序,最终决定 Pod 被调度到哪个节点。
3.3 绑定插件
- 代码位置: pkg/scheduler/plugins/
- 主要功能: 绑定插件负责确定 Pod 被绑定到哪个节点上。
节点选择
4.1 候选节点选择
- 代码位置: pkg/scheduler/algorithm/predicates.go
- 主要功能: 调度器在节点选择阶段根据预选和优选函数选择候选节点。
4.2 节点权重计算
- 代码位置: pkg/scheduler/algorithm/priorities.go
- 主要功能: 调度器通过计算节点的权重,最终确定 Pod 被调度到哪个节点。
调度事件处理
5.1 调度事件处理逻辑
- 代码位置: pkg/scheduler/scheduler.go
- 主要功能: 调度器根据调度事件的类型,执行相应的事件处理逻辑。
5.2 事件队列
- 代码位置: pkg/scheduler/factory/factory.go
- 主要功能: 调度器使用事件队列来异步处理调度事件,确保调度逻辑是非阻塞的。
二次开发扩展点
调度器插件的自定义
1.1 自定义预选插件
- 代码位置: pkg/scheduler/plugins/
- 主要功能: 你可以编写自定义的预选插件,以实现对节点可用性的自定义判断逻辑。
1.2 自定义优选插件
- 代码位置: pkg/scheduler/plugins/
- 主要功能: 你可以编写自定义的优选插件,以实现对节点优选顺序的自定义调整。
1.3 自定义绑定插件
- 代码位置: pkg/scheduler/plugins/
- 主要功能: 你可以编写自定义的绑定插件,以实现对 Pod 绑定到节点的自定义策略。
调度算法的自定义
2.1 优先级函数的扩展
- 代码位置: pkg/scheduler/algorithm/priorities.go
- 主要功能: 你可以编写自定义的优先级函数,以实现对 Pod 调度优先级的自定义计算。
2.2 优选函数的扩展
- 代码位置: pkg/scheduler/algorithm/predicates.go
- 主要功能: 你可以编写自定义的优选函数,以实现对节点的可调度性的自定义判断。
调度器的扩展
3.1 调度器阶段的扩展
- 代码位置: pkg/scheduler/framework/framework.go
- 主要功能: 你可以扩展调度器的各个阶段,以实现对调度流程的自定义控制。
3.2 调度器事件处理的扩展
- 代码位置: pkg/scheduler/scheduler.go
- 主要功能: 你可以扩展调度器的事件处理逻辑,以实现对调度事件的自定义响应。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Macolm's Blog!