Kubernetes调度框架深度解析:架构设计与核心机制
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
Kubernetes调度框架(Scheduling Framework)是Kubernetes调度器(kube-scheduler)的核心架构设计,自v1.19版本起进入稳定状态。该框架采用插件化设计,将调度功能模块化,使开发者能够在不修改核心代码的情况下扩展调度能力。
调度框架的核心设计理念
调度框架的设计遵循以下几个关键原则:
- 插件化架构:将调度逻辑分解为多个可插拔的组件
- 职责分离:核心调度器保持轻量,复杂逻辑由插件实现
- 扩展性:通过定义良好的接口支持功能扩展
- 状态管理:提供清晰的机制管理调度过程中的状态
调度周期与绑定周期
调度框架将Pod的调度过程分为两个主要阶段:
调度周期(Scheduling Cycle)
- 负责为Pod选择合适的节点
- 是串行执行的,确保调度决策的一致性
- 包含多个扩展点(Extension Points),插件可以在这些点上介入
绑定周期(Binding Cycle)
- 将调度决策应用到集群
- 可以并行执行,提高调度吞吐量
- 同样包含多个扩展点,用于处理绑定相关逻辑
当调度或绑定过程中出现错误时,整个调度上下文会被终止,Pod会被重新放回队列等待重试。
核心扩展点详解
调度框架定义了丰富的扩展点,下面我们详细分析每个扩展点的功能和使用场景:
1. 队列管理扩展点
PreEnqueue
- 在Pod进入活跃队列前执行
- 所有插件必须返回Success,Pod才能进入队列
- 可用于实现准入控制或预处理
QueueSort
- 定义Pod在调度队列中的排序规则
- 集群中只能启用一个队列排序插件
- 默认实现基于Pod优先级和创建时间
2. 调度决策扩展点
PreFilter
- 预处理Pod信息
- 检查集群或Pod必须满足的条件
- 失败会终止当前调度周期
Filter
- 过滤掉不适合运行Pod的节点
- 也称为"Predicates"阶段
- 可并行评估节点
PostFilter
- 当没有合适节点时调用
- 典型实现是抢占(Preemption)机制
- 可以尝试通过资源回收使Pod可调度
3. 评分扩展点
PreScore
- 为Score阶段准备共享状态
- 减少重复计算,提高性能
Score
- 为通过过滤的节点打分
- 每个插件为节点分配一个分数
- 最终分数会结合各插件的权重
NormalizeScore
- 标准化分数到统一范围
- 确保不同评分插件的分数可比
4. 资源预留扩展点
Reserve
- 包含Reserve和Unreserve两个方法
- 用于管理运行时状态
- 防止资源竞争条件
5. 绑定控制扩展点
Permit
- 最后一道调度关卡
- 可以批准、拒绝或延迟绑定
- 支持超时机制
PreBind
- 绑定前准备工作
- 如挂载存储卷、配置网络
Bind
- 实际执行Pod与节点的绑定
- 插件可以跳过不处理的Pod
PostBind
- 绑定后的清理工作
- 信息性接口,不影响调度结果
存储容量评分机制
从v1.33版本开始,Kubernetes引入了StorageCapacityScoring
特性门控,取代了之前的VolumeCapacityPriority
。该特性:
- 支持静态和动态供应的存储
- 基于节点存储容量进行评分
- 需要CSI驱动支持存储容量跟踪
- 特别适用于本地存储场景
插件开发实践
开发自定义调度插件需要实现两个步骤:
- 插件注册:定义插件名称和配置
- 接口实现:实现目标扩展点的接口方法
典型的插件接口定义如下:
type Plugin interface {
Name() string
}
type QueueSortPlugin interface {
Plugin
Less(*v1.pod, *v1.pod) bool
}
配置管理
在Kubernetes v1.18及以上版本中:
- 大多数调度插件默认启用
- 可以自定义插件配置
- 支持多调度器配置
- 可以为不同工作负载定义不同的调度策略
最佳实践与注意事项
- 插件设计:保持插件功能单一,避免复杂状态管理
- 性能考量:Filter插件应尽量轻量,避免影响调度吞吐量
- 错误处理:明确各扩展点的错误处理语义
- 兼容性:注意不同Kubernetes版本的特性支持
- 测试策略:充分测试插件在各种场景下的行为
总结
Kubernetes调度框架通过精心设计的扩展点,为调度功能提供了高度可扩展的架构。理解这些扩展点的工作机制和适用场景,对于开发自定义调度逻辑和优化集群调度性能至关重要。无论是实现简单的过滤逻辑还是复杂的调度策略,调度框架都能提供灵活而强大的支持。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考