核心职责与设计目标
Scheduler 是 Kubernetes 的核心调度组件,负责将未绑定的 Pod 分配到最优 Node 上运行。其设计目标包括:
- 公平性:确保每个节点都有被分配资源的机会
- 资源高效利用:最大化集群资源利用率(CPU/内存/存储等)
- 调度效率:快速完成大规模 Pod 调度(支持数千节点)
- 灵活性:支持自定义调度策略和扩展机制
核心架构组件
- 调度队列(Scheduling Queue)
- 存储待调度 Pod,按优先级排序(高优先级优先调度)
- 支持抢占机制(高优先级 Pod 可驱逐低优先级 Pod)
- 调度框架(Scheduler Framework)
- 提供 14 个可插拔的扩展点:
- PreFilter → Filter → PostFilter → PreScore → Score → Reserve → Permit → PreBind → Bind → PostBind
- 关键扩展点:
- Filter:执行预选策略(原 Predicates)
- Score:执行优选策略(原 Priorities)
- Bind:执行节点绑定操作
- 提供 14 个可插拔的扩展点:
- 调度缓存(Scheduler Cache)
- 缓存集群实时状态(Node 资源、Pod 分布等)
- 通过 List-Watch 机制监听 API Server 的 Node/Pod 变更
调度流程(两阶段机制)
阶段 1:预选(Filtering) - 过滤不满足条件的节点
- 一票否决制:任一策略失败即排除节点
- 主要过滤策略:
- NodeResourcesFit:检查节点剩余资源是否 ≥ Pod 请求资源
- PodFitsHostPorts:检查节点端口是否被占用
- NodeAffinity:检查节点标签是否匹配 Pod 的 nodeSelector
- TaintToleration:检查 Pod 是否容忍节点污点
阶段 2:优选(Scoring) - 对候选节点打分排序
- 权重加权计算:最终得分 = Σ(策略权重 × 策略得分)
- 主要评分策略:
- LeastRequestedPriority:优化目标为资源剩余最多(计算公式:(NodeCapacity - Requested)/NodeCapacity)
- BalancedResourceAllocation:优化目标为 CPU/内存使用均衡(计算公式:1 - |CPU利用率-内存利用率|)
- InterPodAffinity:优化目标为同类型 Pod 拓扑分布
阶段 3:绑定(Binding) - 异步执行绑定
- Reserve:临时预留节点资源(防止并发冲突)
- PreBind:执行前置操作(如存储卷挂zai)
- Bind:向 API Server 提交绑定请求(更新 Pod 的 nodeName 字段)
- PostBind:清理缓存等收尾工作
异常处理:若绑定失败,触发 Unreserve 释放资源,Pod 重回调度队列
性能优化机制
- 局部最优策略:大型集群(>5000 节点)仅评估部分节点,规避全局调度带来的大量性能开销
- 并发调度:
- 预选/优选阶段并行处理多个 Pod
- 绑定阶段异步执行(通过 Goroutine 实现)
- 调度缓存:减少对 API Server 的直接访问
扩展机制
- 自定义调度策略:
- 通过 KubeSchedulerConfiguration 配置文件
- 可自定义 Filter 和 Score 插件
- 多调度器共存:
- 在 Pod Spec 中指定 schedulerName
- 默认值为 default-scheduler
异常处理场景
- 无节点满足预选条件:持续重试调度,Pod 保持 Pending 状态
- 资源不足触发抢占:驱逐低优先级 Pod,被抢占 Pod 重新调度
- 绑定过程失败:回滚资源预留,Pod 重新入队调度