Kubernetes 1.23.6 kube-scheduler 默认打分和排序机制详解
#作者:邓伟
文章目录
- 一、kube-scheduler 概述
- 二、默认打分插件及权重配置
- 三、核心打分插件实现原理
- 3.1 NodeAffinity 插件
- 3.2 TaintToleration 插件
- 3.3 NodeResourcesFit 插件
- 3.4 LeastRequestedPriority 插件
- 3.5 BalancedResourceAllocation 插件
- 3.6 ImageLocalityPriority 插件
- 四、排序机制详解
- 五、1.23.6 版本与其他版本的差异
- 六、查看和修改调度器配置
- 6.1 查看默认配置
- 6.2 修改配置示例(增加 Pod 间亲和性权重)
- 七、优化调度策略的建议
- 八、总结
- 九、参考
一、kube-scheduler 概述
在 Kubernetes 1.23.6 版本里,kube-scheduler 作为集群关键的调度组件,承担着为 Pod 分配最佳 Node 节点的重任。其调度进程主要涵盖三个阶段:
-
过滤阶段 (Filtering):从众多节点中筛选出符合 Pod 基本调度条件的候选 Node。
-
打分阶段 (Scoring):对过滤后得到的候选 Node,从多个维度进行评分。
-
排序阶段 (Ranking):依据打分结果对候选 Node 排序,进而选出最适宜的 Node。
本文将着重剖析 1.23.6 版本中 kube-scheduler 的默认打分和排序机制。
二、默认打分插件及权重配置
在 1.23.6 版本中,kube-scheduler 默认启用了以下打分插件,各插件的权重配置如下:
三、核心打分插件实现原理
3.1 NodeAffinity 插件
该插件主要评估 Pod 的nodeAffinity规则与 Node 标签的契合度:
-
requiredDuringSchedulingIgnoredDuringExecution(硬亲和性):此部分不参与打分,而是在过滤阶段发挥作用。
-
preferredDuringSchedulingIgnoredDuringExecution(软亲和性):根据匹配程度进行打分。
评分公式:
score = (匹配的preferred规则数量 / 总preferred规则数量) * 200
最终得分会被归一化到 0 - 10 分的区间内。
3.2 TaintToleration 插件
该插件主要评估 Pod 对 Node 污点的容忍情况:
-
计算 Node 上未被 Pod 容忍的污点数量。
-
未容忍的污点数量越多,得分越低。
评分公式:
score = (1 - 未被容忍的污点数量 / 总污点数量) * 300
同样,最终得分会被归一化到 0 - 10 分区间。
3.3 NodeResourcesFit 插件
该插件用于评估 Node 资源(CPU、内存、存储)与 Pod 请求的适配度:
-
计算资源请求占 Node 可用资源的比例。
-
资源使用率越低,得分越高。
评分公式:
cpuScore = (1 - CPU请求/CPU可用) * 10
memoryScore = (1 - 内存请求/内存可用) * 10
storageScore = (1 - 存储请求/存储可用) * 10
最终得分 = (cpuScore + memoryScore + storageScore) / 3
3.4 LeastRequestedPriority 插件
该插件倾向于选择资源请求最少的 Node:
-
计算 Node 上已运行 Pod 的资源请求总和。
-
资源请求越少,得分越高。
评分公式:
cpuScore = (CPU可用 - CPU请求) / CPU可用 * 10
memoryScore = (内存可用 - 内存请求) / 内存可用 * 10
最终得分 = (cpuScore + memoryScore) / 2
3.5 BalancedResourceAllocation 插件
该插件旨在选择资源分配更为均衡的 Node:
-
计算 CPU 和内存使用率的方差。
-
方差越小(即资源分配越均衡),得分越高。
评分公式:
cpuFraction = CPU使用量 / CPU容量memoryFraction = 内存使用量 / 内存容量variance = (cpuFraction - memoryFraction)^2 / 2
score = (1 - variance) * 10
3.6 ImageLocalityPriority 插件
该插件优先选择已缓存 Pod 所需镜像的 Node:
1.检查 Node 是否已缓存 Pod 使用的镜像。
2.镜像越大且已缓存,得分越高。
评分公式:
score = (已缓存镜像大小总和 / 所有镜像总大小) * 10
四、排序机制详解
在所有打分插件完成评分后,kube-scheduler 会执行以下操作:
-
计算每个候选 Node 的总分(各插件得分加权求和)。
-
按照总分从高到低进行排序。
-
若出现多个 Node 总分相同的情况,则随机选择其中一个 Node。
总分计算示例:
假设某 Node 在各插件的得分及权重如下:
-
NodeAffinity: 8 分(权重 2)
-
TaintToleration: 10 分(权重 3)
-
NodeResourcesFit: 7 分(权重 1)
-
LeastRequestedPriority: 9 分(权重 1)
-
BalancedResourceAllocation: 6 分(权重 1)
-
ImageLocalityPriority: 8 分(权重 1)
则该 Node 的总分为:
(8*2 + 10*3 + 7*1 + 9*1 + 6*1 + 8*1) / (2+3+1+1+1+1) = 8.5分
五、1.23.6 版本与其他版本的差异
与 1.24 + 版本相比,1.23.6 的调度器存在以下主要差异点:
-
插件名称不同:例如 1.24 + 版本中的NodeResourcesBalancedAllocation,在 1.23.6 版本中为BalancedResourceAllocation。
-
默认权重调整:部分插件的权重在新版本中有所变动。
-
插件默认状态:如InterPodAffinity在 1.23.6 版本中默认禁用,而在 1.24 + 版本中默认启用。
六、查看和修改调度器配置
在 1.23.6 版本中,可以通过以下方式查看和修改调度器配置:
6.1 查看默认配置
kubectl get configmap kube-scheduler-config -n kube-system -o yaml
6.2 修改配置示例(增加 Pod 间亲和性权重)
apiVersion: kubescheduler.config.k8s.io/v1beta2kind: KubeSchedulerConfiguration
profiles:- schedulerName: default-schedulerplugins:score:enabled:- name: InterPodAffinityweight: 2 # 调整权重为2
七、优化调度策略的建议
-
合理设置 Node 标签和污点:借助 NodeAffinity 和 TaintToleration 引导 Pod 的调度方向。
-
优化资源请求配置:精确设置 requests 和 limits,避免资源的浪费。
-
利用 Pod 间亲和性 / 反亲和性:可将相关 Pod 调度到同一 Node,或者分散到不同 Node。
-
监控调度性能:通过 metrics 监控调度延迟和成功率,以便及时调整策略。
八、总结
Kubernetes 1.23.6 的 kube-scheduler 凭借多维的打分和排序机制,实现了智能且高效的 Pod 调度。深入理解其默认打分插件的工作原理和权重配置,有助于管理员优化集群资源分配,提升应用运行的稳定性。在实际生产环境中,建议依据业务特点定制调度策略,充分挖掘 Kubernetes 的调度潜力。
九、参考
K8s scheduler 调度:预选和优选策略:https://cloud.tencent.com/developer/news/1075875
k8s基础之schedule调度器:rhttps://blog.csdn.net/qq_23435961/article/details/108713695