searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Kubernetes Scheduler 原理初探

2025-06-06 08:26:11
3
0

核心职责与设计目标

Scheduler 是 Kubernetes 的核心调度组件,负责将未绑定的 Pod 分配到最优 Node 上运行。其设计目标包括:

  • 公平性:确保每个节点都有被分配资源的机会
  • 资源高效利用:最大化集群资源利用率(CPU/内存/存储等)
  • 调度效率:快速完成大规模 Pod 调度(支持数千节点)
  • 灵活性:支持自定义调度策略和扩展机制

核心架构组件

  1. 调度队列(Scheduling Queue)
    • 存储待调度 Pod,按优先级排序(高优先级优先调度)
    • 支持抢占机制(高优先级 Pod 可驱逐低优先级 Pod)
  2. 调度框架(Scheduler Framework)
    • 提供 14 个可插拔的扩展点:
      • PreFilter → Filter → PostFilter → PreScore → Score → Reserve → Permit → PreBind → Bind → PostBind
    • 关键扩展点:
      • Filter:执行预选策略(原 Predicates)
      • Score:执行优选策略(原 Priorities)
      • Bind:执行节点绑定操作
  3. 调度缓存(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) - 异步执行绑定

  1. Reserve:临时预留节点资源(防止并发冲突)
  2. PreBind:执行前置操作(如存储卷挂zai)
  3. Bind:向 API Server 提交绑定请求(更新 Pod 的 nodeName 字段)
  4. PostBind:清理缓存等收尾工作

异常处理:若绑定失败,触发 Unreserve 释放资源,Pod 重回调度队列

性能优化机制

  1. 局部最优策略:大型集群(>5000 节点)仅评估部分节点,规避全局调度带来的大量性能开销
  2. 并发调度:
    • 预选/优选阶段并行处理多个 Pod
    • 绑定阶段异步执行(通过 Goroutine 实现)
  3. 调度缓存:减少对 API Server 的直接访问

扩展机制

  1. 自定义调度策略:
    • 通过 KubeSchedulerConfiguration 配置文件
    • 可自定义 Filter 和 Score 插件
  2. 多调度器共存:
    • 在 Pod Spec 中指定 schedulerName
    • 默认值为 default-scheduler

异常处理场景

  1. 无节点满足预选条件:持续重试调度,Pod 保持 Pending 状态
  2. 资源不足触发抢占:驱逐低优先级 Pod,被抢占 Pod 重新调度
  3. 绑定过程失败:回滚资源预留,Pod 重新入队调度
0条评论
0 / 1000
黄****强
3文章数
0粉丝数
黄****强
3 文章 | 0 粉丝
黄****强
3文章数
0粉丝数
黄****强
3 文章 | 0 粉丝
原创

Kubernetes Scheduler 原理初探

2025-06-06 08:26:11
3
0

核心职责与设计目标

Scheduler 是 Kubernetes 的核心调度组件,负责将未绑定的 Pod 分配到最优 Node 上运行。其设计目标包括:

  • 公平性:确保每个节点都有被分配资源的机会
  • 资源高效利用:最大化集群资源利用率(CPU/内存/存储等)
  • 调度效率:快速完成大规模 Pod 调度(支持数千节点)
  • 灵活性:支持自定义调度策略和扩展机制

核心架构组件

  1. 调度队列(Scheduling Queue)
    • 存储待调度 Pod,按优先级排序(高优先级优先调度)
    • 支持抢占机制(高优先级 Pod 可驱逐低优先级 Pod)
  2. 调度框架(Scheduler Framework)
    • 提供 14 个可插拔的扩展点:
      • PreFilter → Filter → PostFilter → PreScore → Score → Reserve → Permit → PreBind → Bind → PostBind
    • 关键扩展点:
      • Filter:执行预选策略(原 Predicates)
      • Score:执行优选策略(原 Priorities)
      • Bind:执行节点绑定操作
  3. 调度缓存(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) - 异步执行绑定

  1. Reserve:临时预留节点资源(防止并发冲突)
  2. PreBind:执行前置操作(如存储卷挂zai)
  3. Bind:向 API Server 提交绑定请求(更新 Pod 的 nodeName 字段)
  4. PostBind:清理缓存等收尾工作

异常处理:若绑定失败,触发 Unreserve 释放资源,Pod 重回调度队列

性能优化机制

  1. 局部最优策略:大型集群(>5000 节点)仅评估部分节点,规避全局调度带来的大量性能开销
  2. 并发调度:
    • 预选/优选阶段并行处理多个 Pod
    • 绑定阶段异步执行(通过 Goroutine 实现)
  3. 调度缓存:减少对 API Server 的直接访问

扩展机制

  1. 自定义调度策略:
    • 通过 KubeSchedulerConfiguration 配置文件
    • 可自定义 Filter 和 Score 插件
  2. 多调度器共存:
    • 在 Pod Spec 中指定 schedulerName
    • 默认值为 default-scheduler

异常处理场景

  1. 无节点满足预选条件:持续重试调度,Pod 保持 Pending 状态
  2. 资源不足触发抢占:驱逐低优先级 Pod,被抢占 Pod 重新调度
  3. 绑定过程失败:回滚资源预留,Pod 重新入队调度
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0