概述
kube-scheduler是Kubernetes集群的调度器,负责为新创建的Pod选择合适的节点。它通过一系列复杂的调度算法,考虑资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间干扰等因素,做出最优的调度决策。本文将深入分析kube-scheduler的源码实现,揭示其精妙的调度机制。
1. kube-scheduler架构设计
1.1 整体架构概览
graph TB
subgraph "kube-scheduler 核心架构"
subgraph "调度器核心"
MAIN[Scheduler Main
调度器主控制器
- 启动协调
- 配置管理
- 生命周期管理
- 优雅关闭] SCHED_LOOP[Scheduling Loop
调度循环
- Pod队列管理
- 调度决策
- 绑定操作
- 错误处理] QUEUE_MGR[Queue Manager
队列管理器
- 优先级队列
- 调度队列
- 等待队列
- 重试机制] end subgraph "调度框架" FRAMEWORK[Scheduling Framework
调度框架
- 插件管理
- 扩展点
- 生命周期
- 状态管理] PROFILE[Scheduler Profile
调度配置
- 插件配置
- 算法选择
- 参数调优
- 多配置支持] CACHE[Scheduler Cache
调度缓存
- 节点信息缓存
- Pod信息缓存
- 资源状态
- 快照管理] end subgraph "调度算法" subgraph "预选阶段 Filter" NODE_RESOURCES[NodeResourcesFit
节点资源过滤
- CPU/内存检查
- 扩展资源检查
- 资源配额验证
- 超卖策略] NODE_AFFINITY[NodeAffinity
节点亲和性
- 必须满足条件
- 优选满足条件
- 标签选择器
- 拓扑域] POD_AFFINITY[InterPodAffinity
Pod间亲和性
- Pod亲和性
- Pod反亲和性
- 拓扑域
- 权重计算] TAINTS_TOLERATIONS[TaintToleration
污点容忍
- 污点匹配
- 容忍策略
- 效果处理
- 时间限制] end subgraph "优选阶段 Score" RESOURCE_SCORE[NodeResourcesFit
资源利用率打分
- 平衡分配
- 最少分配
- 最多分配
- 请求比例] AFFINITY_SCORE[NodeAffinity
亲和性打分
- 优选条件权重
- 匹配程度
- 标签权重
- 拓扑分布] SPREAD_SCORE[PodTopologySpread
拓扑分布打分
- 均匀分布
- 倾斜度计算
- 约束权重
- 域分布] IMAGE_SCORE[ImageLocality
镜像本地性打分
- 镜像存在性
- 镜像大小
- 拉取时间
- 本地缓存] end end subgraph "扩展点" PRE_FILTER[PreFilter
预过滤
- 预处理逻辑
- 状态计算
- 早期拒绝
- 性能优化] POST_FILTER[PostFilter
后过滤
- 抢占逻辑
- 资源回收
- 调度失败处理
- 重新调度] PRE_SCORE[PreScore
预打分
- 打分预处理
- 状态准备
- 数据预计算
- 优化准备] NORMALIZE[NormalizeScore
分数归一化
- 分数标准化
- 权重应用
- 分数合并
- 最终排序] RESERVE[Reserve
资源预留
- 资源预占
- 状态保存
- 回滚准备
- 并发控制] PERMIT[Permit
许可检查
- 最终验证
- 延迟绑定
- 条件等待
- 批量处理] PRE_BIND[PreBind
绑定前处理
- 资源准备
- 卷挂载
- 网络配置
- 依赖检查] BIND[Bind
绑定操作
- Pod绑定
- API调用
- 状态更新
- 结果通知] POST_BIND[PostBind
绑定后处理
- 清理工作
- 状态更新
- 事件记录
- 指标更新] end subgraph "调度策略" PREEMPTION[Preemption
抢占机制
- 抢占候选
- 优先级比较
- 受害者选择
- 优雅驱逐] PRIORITY[Priority
优先级调度
- 优先级类
- 队列排序
- 资源预留
- 抢占策略] TOPOLOGY[Topology
拓扑感知
- 域分布
- 约束满足
- 均衡策略
- 倾斜控制] end end %% 组件间连接关系 MAIN --> SCHED_LOOP SCHED_LOOP --> QUEUE_MGR SCHED_LOOP --> FRAMEWORK FRAMEWORK --> PROFILE FRAMEWORK --> CACHE FRAMEWORK --> PRE_FILTER PRE_FILTER --> NODE_RESOURCES PRE_FILTER --> NODE_AFFINITY PRE_FILTER --> POD_AFFINITY PRE_FILTER --> TAINTS_TOLERATIONS NODE_RESOURCES --> POST_FILTER POST_FILTER --> PRE_SCORE PRE_SCORE --> RESOURCE_SCORE PRE_SCORE --> AFFINITY_SCORE PRE_SCORE --> SPREAD_SCORE PRE_SCORE --> IMAGE_SCORE RESOURCE_SCORE --> NORMALIZE NORMALIZE --> RESERVE RESERVE --> PERMIT PERMIT --> PRE_BIND PRE_BIND --> BIND BIND --> POST_BIND FRAMEWORK --> PREEMPTION FRAMEWORK --> PRIORITY FRAMEWORK --> TOPOLOGY %% 样式定义 classDef schedulerCore fill:#e1f5fe,stroke:#01579b,stroke-width:2px classDef framework fill:#f3e5f5,stroke:#4a148c,stroke-width:2px classDef filterAlgorithm fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px classDef scoreAlgorithm fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef extensionPoints fill:#fce4ec,stroke:#880e4f,stroke-width:2px classDef schedulingPolicy fill:#e0f2f1,stroke:#004d40,stroke-width:2px class MAIN,SCHED_LOOP,QUEUE_MGR schedulerCore class FRAMEWORK,PROFILE,CACHE framework class NODE_RESOURCES,NODE_AFFINITY,POD_AFFINITY,TAINTS_TOLERATIONS filterAlgorithm class RESOURCE_SCORE,AFFINITY_SCORE,SPREAD_SCORE,IMAGE_SCORE scoreAlgorithm class PRE_FILTER,POST_FILTER,PRE_SCORE,NORMALIZE,RESERVE,PERMIT,PRE_BIND,BIND,POST_BIND extensionPoints class PREEMPTION,PRIORITY,TOPOLOGY schedulingPolicy
调度器主控制器
- 启动协调
- 配置管理
- 生命周期管理
- 优雅关闭] SCHED_LOOP[Scheduling Loop
调度循环
- Pod队列管理
- 调度决策
- 绑定操作
- 错误处理] QUEUE_MGR[Queue Manager
队列管理器
- 优先级队列
- 调度队列
- 等待队列
- 重试机制] end subgraph "调度框架" FRAMEWORK[Scheduling Framework
调度框架
- 插件管理
- 扩展点
- 生命周期
- 状态管理] PROFILE[Scheduler Profile
调度配置
- 插件配置
- 算法选择
- 参数调优
- 多配置支持] CACHE[Scheduler Cache
调度缓存
- 节点信息缓存
- Pod信息缓存
- 资源状态
- 快照管理] end subgraph "调度算法" subgraph "预选阶段 Filter" NODE_RESOURCES[NodeResourcesFit
节点资源过滤
- CPU/内存检查
- 扩展资源检查
- 资源配额验证
- 超卖策略] NODE_AFFINITY[NodeAffinity
节点亲和性
- 必须满足条件
- 优选满足条件
- 标签选择器
- 拓扑域] POD_AFFINITY[InterPodAffinity
Pod间亲和性
- Pod亲和性
- Pod反亲和性
- 拓扑域
- 权重计算] TAINTS_TOLERATIONS[TaintToleration
污点容忍
- 污点匹配
- 容忍策略
- 效果处理
- 时间限制] end subgraph "优选阶段 Score" RESOURCE_SCORE[NodeResourcesFit
资源利用率打分
- 平衡分配
- 最少分配
- 最多分配
- 请求比例] AFFINITY_SCORE[NodeAffinity
亲和性打分
- 优选条件权重
- 匹配程度
- 标签权重
- 拓扑分布] SPREAD_SCORE[PodTopologySpread
拓扑分布打分
- 均匀分布
- 倾斜度计算
- 约束权重
- 域分布] IMAGE_SCORE[ImageLocality
镜像本地性打分
- 镜像存在性
- 镜像大小
- 拉取时间
- 本地缓存] end end subgraph "扩展点" PRE_FILTER[PreFilter
预过滤
- 预处理逻辑
- 状态计算
- 早期拒绝
- 性能优化] POST_FILTER[PostFilter
后过滤
- 抢占逻辑
- 资源回收
- 调度失败处理
- 重新调度] PRE_SCORE[PreScore
预打分
- 打分预处理
- 状态准备
- 数据预计算
- 优化准备] NORMALIZE[NormalizeScore
分数归一化
- 分数标准化
- 权重应用
- 分数合并
- 最终排序] RESERVE[Reserve
资源预留
- 资源预占
- 状态保存
- 回滚准备
- 并发控制] PERMIT[Permit
许可检查
- 最终验证
- 延迟绑定
- 条件等待
- 批量处理] PRE_BIND[PreBind
绑定前处理
- 资源准备
- 卷挂载
- 网络配置
- 依赖检查] BIND[Bind
绑定操作
- Pod绑定
- API调用
- 状态更新
- 结果通知] POST_BIND[PostBind
绑定后处理
- 清理工作
- 状态更新
- 事件记录
- 指标更新] end subgraph "调度策略" PREEMPTION[Preemption
抢占机制
- 抢占候选
- 优先级比较
- 受害者选择
- 优雅驱逐] PRIORITY[Priority
优先级调度
- 优先级类
- 队列排序
- 资源预留
- 抢占策略] TOPOLOGY[Topology
拓扑感知
- 域分布
- 约束满足
- 均衡策略
- 倾斜控制] end end %% 组件间连接关系 MAIN --> SCHED_LOOP SCHED_LOOP --> QUEUE_MGR SCHED_LOOP --> FRAMEWORK FRAMEWORK --> PROFILE FRAMEWORK --> CACHE FRAMEWORK --> PRE_FILTER PRE_FILTER --> NODE_RESOURCES PRE_FILTER --> NODE_AFFINITY PRE_FILTER --> POD_AFFINITY PRE_FILTER --> TAINTS_TOLERATIONS NODE_RESOURCES --> POST_FILTER POST_FILTER --> PRE_SCORE PRE_SCORE --> RESOURCE_SCORE PRE_SCORE --> AFFINITY_SCORE PRE_SCORE --> SPREAD_SCORE PRE_SCORE --> IMAGE_SCORE RESOURCE_SCORE --> NORMALIZE NORMALIZE --> RESERVE RESERVE --> PERMIT PERMIT --> PRE_BIND PRE_BIND --> BIND BIND --> POST_BIND FRAMEWORK --> PREEMPTION FRAMEWORK --> PRIORITY FRAMEWORK --> TOPOLOGY %% 样式定义 classDef schedulerCore fill:#e1f5fe,stroke:#01579b,stroke-width:2px classDef framework fill:#f3e5f5,stroke:#4a148c,stroke-width:2px classDef filterAlgorithm fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px classDef scoreAlgorithm fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef extensionPoints fill:#fce4ec,stroke:#880e4f,stroke-width:2px classDef schedulingPolicy fill:#e0f2f1,stroke:#004d40,stroke-width:2px class MAIN,SCHED_LOOP,QUEUE_MGR schedulerCore class FRAMEWORK,PROFILE,CACHE framework class NODE_RESOURCES,NODE_AFFINITY,POD_AFFINITY,TAINTS_TOLERATIONS filterAlgorithm class RESOURCE_SCORE,AFFINITY_SCORE,SPREAD_SCORE,IMAGE_SCORE scoreAlgorithm class PRE_FILTER,POST_FILTER,PRE_SCORE,NORMALIZE,RESERVE,PERMIT,PRE_BIND,BIND,POST_BIND extensionPoints class PREEMPTION,PRIORITY,TOPOLOGY schedulingPolicy
1.2 核心数据结构
1.2.1 Scheduler主结构体
|
|
1.2.2 调度框架结构体
|
|
2. 启动流程深度解析
2.1 main函数入口
|
|
2.2 命令创建和配置
|
|
2.3 调度器运行主流程
|
|
2.4 启动时序图
sequenceDiagram
participant Main as main()
participant Cmd as cobra.Command
participant Options as Options
participant Config as CompletedConfig
participant Scheduler as Scheduler
participant Framework as Framework
participant Queue as SchedulingQueue
participant Cache as Cache
Note over Main,Cache: kube-scheduler启动完整流程
Main->>Cmd: 1. NewSchedulerCommand()
Cmd->>Options: 2. NewOptions() 创建默认选项
Options->>Options: 3. 设置默认配置值
Main->>Cmd: 4. cli.Run(command)
Cmd->>Options: 5. Validate() 验证配置
Options->>Options: 6. 检查配置有效性
Cmd->>Config: 7. Config() 获取配置
Config->>Config: 8. Complete() 完成配置
Cmd->>Scheduler: 9. Run(ctx, completedConfig)
Scheduler->>Scheduler: 10. New() 创建调度器实例
Note over Scheduler: 初始化各种组件
Scheduler->>Cache: 11. 创建调度缓存
Cache->>Cache: 12. 初始化节点信息缓存
Scheduler->>Queue: 13. 创建调度队列
Queue->>Queue: 14. 初始化优先级队列
Scheduler->>Framework: 15. 创建调度框架
Framework->>Framework: 16. 注册调度插件
Framework->>Framework: 17. 构建插件链
Note over Scheduler: 启动各种服务
Scheduler->>Scheduler: 18. 启动健康检查服务器
Scheduler->>Scheduler: 19. 启动指标服务器
Scheduler->>Scheduler: 20. 启动Informers
Scheduler->>Scheduler: 21. 等待缓存同步
Scheduler->>Scheduler: 22. sched.Run() 启动调度循环
Note over Main,Cache: 调度器运行中
loop 主要调度循环
Queue->>Scheduler: 23. 获取待调度Pod
Scheduler->>Framework: 24. 执行调度算法
Framework->>Framework: 25. 预过滤阶段
Framework->>Framework: 26. 过滤阶段
Framework->>Framework: 27. 预打分阶段
Framework->>Framework: 28. 打分阶段
Framework->>Framework: 29. 选择最优节点
Scheduler->>Scheduler: 30. 绑定Pod到节点
Scheduler->>Cache: 31. 更新缓存状态
end
3. 调度算法核心实现
3.1 调度主循环
|
|
3.2 调度算法实现
|
|
4. 调度插件深度分析
4.1 NodeResourcesFit插件实现
|
|
4.2 NodeAffinity插件实现
|
|
5. 调度队列管理
5.1 优先级队列实现
|
|
6. 性能优化和最佳实践
6.1 调度性能优化
|
|
6.2 调度延迟优化
|
|
7. 总结与最佳实践
7.1 架构设计原则
kube-scheduler的设计体现了以下核心原则:
- 插件化架构:通过调度框架支持灵活的插件扩展
- 分阶段处理:预过滤、过滤、打分、绑定的清晰流程
- 并行处理:支持多节点并行过滤和打分
- 优先级调度:基于优先级的Pod调度队列
- 性能优化:多种优化策略保证大规模集群性能
7.2 性能优化建议
调度算法优化
- 合理设置节点打分百分比
- 启用并行过滤和打分
- 使用高效的调度插件
队列管理优化
- 配置合适的退避策略
- 优化队列排序算法
- 减少锁竞争
缓存策略优化
- 启用节点信息缓存
- 缓存调度决策结果
- 定期清理过期缓存
7.3 运维最佳实践
监控指标
- 调度延迟和吞吐量
- 调度成功率和失败率
- 各阶段性能指标
调度策略
- 合理配置亲和性和反亲和性
- 使用污点和容忍度控制调度
- 配置资源请求和限制
故障排查
- 分析调度失败原因
- 检查节点资源状态
- 验证调度约束配置
8. 最新调度框架特性
8.1 调度框架v2增强
基于最新的技术文章,Kubernetes 1.29+引入了调度框架的重要改进:
|
|
8.2 抢占调度机制
|
|
8.3 调度性能监控和诊断
|
|
<function_calls>