admin管理员组文章数量:1443657
kubernetes默认调度器策略详解
详细了解调度框架(Scheduler Framework)的调度过程。个人观点,请多多指教。
一. 调度框架的核心组件
首先了解调度阶段会经过的组件,主要包括以下组件:
- QueueSort
- 负责对调度队列中的 Pod 进行排序,影响调度器选择 Pod 的顺序。默认情况下,Kubernetes 使用基于Pod 优先级(Priority)的排序策略。
- PreFilter
- 在正式调度(Filter/Score)之前执行一些前置检查或计算,以确保 Pod 满足基本的调度条件,并为后续阶段提供必要的数据。
- Filter
- 用于替代旧版本中的
Predicates
,负责筛选出符合 Pod 调度要求的节点。它的作用是在PreFilter
之后、Score
之前,对候选节点进行硬性条件检查,排除不满足要求的节点。
- 用于替代旧版本中的
- PostFilter
- 用于 处理 Pod 无法被调度的情况(即所有节点在
Filter
阶段被排除)。它的核心作用是提供回退机制或补救措施,而不是直接选择节点。
- 用于 处理 Pod 无法被调度的情况(即所有节点在
- Score
- 用于 替代旧版本中的
Priorities
,负责对通过Filter
阶段的节点进行评分和排序。它的核心作用是为每个节点计算一个分数(通常为 0-100),调度器最终选择分数最高的节点运行 Pod。
- 用于 替代旧版本中的
- Reserve
- 用于 在调度成功但尚未绑定(Bind)前,临时预留节点资源,避免其他 Pod 竞争同一资源。它的核心作用是确保资源分配的原子性,防止并发调度导致的冲突。
- Permit
- Kubernetes 默认未提供内置
Permit
插件 - 它允许在 Pod 绑定(Bind)前暂停调度流程,等待外部系统或自定义逻辑的批准。这种机制常用于实现复杂的准入控制、资源协调或人工审核流程。
- Kubernetes 默认未提供内置
- PreBind
- 在 Pod 绑定到节点之前(
Bind
阶段之前)执行最后的准备工作。这个阶段适合执行那些需要在持久化绑定前完成的逻辑,例如存储卷数据预处理或日志记录等操作。
- 在 Pod 绑定到节点之前(
- Bind
- 调度流程的最终步骤,负责将 Pod 持久化绑定到选定的节点。这是调度过程中唯一真正修改集群状态的阶段,通过 Kubernetes API Server 将 Pod 与节点的关联关系写入 etcd。
- 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 | 节点亲和性匹配程度 | 优先匹配 |
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
,其排序逻辑如下:
- 比较 Pod 优先级:
- 如果
PodA.Priority > PodB.Priority
,则PodA
排在前面。
- 如果
- 如果优先级相同:
- 比较
Pod.CreationTimestamp
,更早创建的 Pod 排在前面。
- 比较
- 如果创建时间相同:
- 按
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默认调度器策略详解
版权声明:本文标题:kubernetes默认调度器策略详解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1748160792a2818977.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论