admin管理员组

文章数量:1443657

kubernetes默认调度器策略详解

详细了解调度框架(Scheduler Framework)的调度过程。个人观点,请多多指教。

一. 调度框架的核心组件

首先了解调度阶段会经过的组件,主要包括以下组件:

  1. QueueSort
    • 负责对调度队列中的 Pod 进行排序,影响调度器选择 Pod 的顺序。默认情况下,Kubernetes 使用基于Pod 优先级(Priority)的排序策略。
  2. PreFilter
    • 在正式调度(Filter/Score)之前执行一些前置检查或计算,以确保 Pod 满足基本的调度条件,并为后续阶段提供必要的数据。
  3. Filter
    • 用于替代旧版本中的 Predicates,负责筛选出符合 Pod 调度要求的节点。它的作用是在 PreFilter 之后、Score 之前,对候选节点进行硬性条件检查,排除不满足要求的节点。
  4. PostFilter
    • 用于 处理 Pod 无法被调度的情况(即所有节点在 Filter 阶段被排除)。它的核心作用是提供回退机制或补救措施,而不是直接选择节点。
  5. Score
    • 用于 替代旧版本中的 Priorities,负责对通过 Filter 阶段的节点进行评分和排序。它的核心作用是为每个节点计算一个分数(通常为 0-100),调度器最终选择分数最高的节点运行 Pod。
  6. Reserve
    • 用于 在调度成功但尚未绑定(Bind)前,临时预留节点资源,避免其他 Pod 竞争同一资源。它的核心作用是确保资源分配的原子性,防止并发调度导致的冲突。
  7. Permit
    • Kubernetes 默认未提供内置 Permit 插件
    • 它允许在 Pod 绑定(Bind)前暂停调度流程,等待外部系统或自定义逻辑的批准。这种机制常用于实现复杂的准入控制、资源协调或人工审核流程。
  8. PreBind
    • 在 Pod 绑定到节点之前(Bind 阶段之前)执行最后的准备工作。这个阶段适合执行那些需要在持久化绑定前完成的逻辑,例如存储卷数据预处理或日志记录等操作。
  9. Bind
    • 调度流程的最终步骤,负责将 Pod 持久化绑定到选定的节点。这是调度过程中唯一真正修改集群状态的阶段,通过 Kubernetes API Server 将 Pod 与节点的关联关系写入 etcd。
  10. PostBind
    • 用于在 Pod 成功绑定到节点后执行后置操作。通常用于通知外部系统、触发资源清理或记录审计日志等场景。

二. 旧版调度器(基于 Predicates/Priorities)

2.1 Predicates(过滤阶段)

四种默认过滤规则

类型

功能

典型检查项

GeneralPredicates

基础资源检查

CPU/Memory 是否足够、端口冲突、节点条件(Ready/DiskPressure 等)

Volume 相关

存储卷限制

卷类型是否匹配、Zone 限制、PV/PVC 绑定状态

宿主机相关

节点属性匹配

节点标签匹配 nodeSelector、污点容忍(Taint/Toleration)

Pod 相关

Pod 间关系

Pod 亲和性/反亲和性(Affinity/Anti-Affinity)

局限性
  • 硬编码逻辑:规则内置在调度器代码中,扩展需修改核心代码。
  • 单一执行流:所有 Predicates 顺序执行,性能受限。
  • 扩展困难:无法动态插入自定义逻辑。

2.2 Priorities(评分阶段)

Priorities 负责对通过 Predicates 的节点进行评分(0-10 分),最终选择分数最高的节点。

默认 Priorities 策略

策略名称

评分依据

目标

LeastRequestedPriority

节点空闲资源比例(CPU/Memory)

优先选择资源利用率低的节点

BalancedResourceAllocation

CPU/Memory 使用量的均衡性

避免资源倾斜(如 CPU 高内存低)

NodeAffinityPriority

节点亲和性匹配程度

优先匹配 nodeAffinity 的节点

TaintTolerationPriority

污点容忍匹配程度

优先容忍度高的节点

InterPodAffinityPriority

Pod 间亲和性/反亲和性

满足亲和性或反亲和性约束

SelectorSpreadPriority

相同标签 Pod 的分布情况

尽量分散 Pod(如跨节点/可用区)

ImageLocalityPriority

节点是否已缓存 Pod 所需镜像

减少镜像拉取时间

局限性
  • 固定权重:每个策略的权重需静态配置(如 BalancedResourceAllocation 权重默认为 1)。
  • 计算耦合:评分逻辑无法动态扩展,新增策略需修改核心代码。
  • 性能瓶颈:所有 Priorities 顺序执行,节点数量多时延迟高。

三. 调度框架(Scheduler Framework)的改进

完全重构为插件化模型

3.1 Predicates → Filter 插件

旧版 Predicates 被拆分为独立的 Filter 插件,支持并行执行:

旧版 Predicates

调度框架插件

优化点

GeneralPredicates

NodeResourcesFit

支持扩展资源(如 GPU/NPU)

Volume 相关

VolumeBinding

动态卷插件(CSI)集成

节点亲和性/污点容忍

NodeAffinity/TaintToleration

支持更复杂的匹配逻辑

Pod 间关系

InterPodAffinity

支持跨拓扑域的精细控制

优势

  • 插件可动态启用/禁用。
  • 过滤阶段支持并发执行(旧版是顺序执行)。

3.2 Priorities → Score 插件

旧版 Priorities 被替换为 Score 插件,支持多维度加权评分:

旧版 Priorities

调度框架插件

改进点

LeastRequestedPriority

NodeResourcesFit(评分部分)

支持自定义资源类型

BalancedResourceAllocation

NodeResourcesBalancedAllocation

可调整权重

NodeAffinityPriority

NodeAffinity

支持动态优先级调整

SelectorSpreadPriority

PodTopologySpread

支持跨拓扑域(机架/可用区)

ImageLocalityPriority

ImageLocality

支持多镜像仓库策略

优势

  • 灵活权重:每个插件的分数可配置权重。
  • 并行评分:插件并发执行,提升性能。
  • 自定义扩展:无需修改核心代码即可添加评分策略。

四. 其他扩展点

QueueSort

Kubernetes 默认的 QueueSort 插件是 PrioritySort,其排序逻辑如下:

  1. 比较 Pod 优先级
    • 如果 PodA.Priority > PodB.Priority,则 PodA 排在前面。
  2. 如果优先级相同
    • 比较 Pod.CreationTimestamp,更早创建的 Pod 排在前面。
  3. 如果创建时间相同
    • Pod.Namespace/Pod.Name 的字典序排序(最终确定性排序)。

PreFilter

Kubernetes 内置了一些 PreFilter 插件:

插件名称

功能

PodTopologySpread

检查 Pod 的拓扑分布约束(Topology Spread Constraints)是否合法

InterPodAffinity

预处理 Pod 亲和性/反亲和性规则

NodeResourcesFit

检查 Pod 的资源请求是否合法(如 CPU/Memory 是否为负数)

VolumeBinding

检查 PVC/PV 绑定情况

PostFilter

Kubernetes 默认实现了以下 PostFilter 插件:

插件名称

功能

DefaultPreemption

尝试抢占(驱逐)低优先级 Pod 以腾出资源

VolumeBinding

处理 PVC 绑定失败后的回退逻辑

Reserve

Kubernetes 默认实现了以下 Reserve 插件:

插件名称

功能

VolumeBinding

预留 PVC/PV 卷(确保存储可用)

NodeResourcesFit

预留 CPU/Memory/GPU 等资源

Permit

Kubernetes 默认未提供内置 Permit 插件

PreBind

Kubernetes 默认实现了以下 PreBind 插件:

插件名称

功能

VolumeBinding

持久化绑定 PVC 到 PV(确保存储卷可用)

Bind

Kubernetes 默认使用以下 Bind 插件:

插件名称

功能

DefaultBinder

通过 API Server 执行标准绑定操作

PostBind

Kubernetes 默认未提供内置 PostBind 插件

本文标签: kubernetes默认调度器策略详解