前言

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
  • 主要功能: 你可以扩展调度器的事件处理逻辑,以实现对调度事件的自定义响应。