当前位置: 首页 > news >正文

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 节点的重任。其调度进程主要涵盖三个阶段:

  1. 过滤阶段 (Filtering):从众多节点中筛选出符合 Pod 基本调度条件的候选 Node。

  2. 打分阶段 (Scoring):对过滤后得到的候选 Node,从多个维度进行评分。

  3. 排序阶段 (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 污点的容忍情况:

  1. 计算 Node 上未被 Pod 容忍的污点数量。

  2. 未容忍的污点数量越多,得分越低。

评分公式:

score = (1 - 未被容忍的污点数量 / 总污点数量) * 300
同样,最终得分会被归一化到 0 - 10 分区间。

3.3 NodeResourcesFit 插件

该插件用于评估 Node 资源(CPU、内存、存储)与 Pod 请求的适配度:

  1. 计算资源请求占 Node 可用资源的比例。

  2. 资源使用率越低,得分越高。

评分公式:

cpuScore = (1 - CPU请求/CPU可用) * 10
memoryScore = (1 - 内存请求/内存可用) * 10
storageScore = (1 - 存储请求/存储可用) * 10
最终得分 = (cpuScore + memoryScore + storageScore) / 3

3.4 LeastRequestedPriority 插件

该插件倾向于选择资源请求最少的 Node:

  1. 计算 Node 上已运行 Pod 的资源请求总和。

  2. 资源请求越少,得分越高。

评分公式:

cpuScore = (CPU可用 - CPU请求) / CPU可用 * 10
memoryScore = (内存可用 - 内存请求) / 内存可用 * 10
最终得分 = (cpuScore + memoryScore) / 2

3.5 BalancedResourceAllocation 插件

该插件旨在选择资源分配更为均衡的 Node:

  1. 计算 CPU 和内存使用率的方差。

  2. 方差越小(即资源分配越均衡),得分越高。

评分公式:

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 会执行以下操作:

  1. 计算每个候选 Node 的总分(各插件得分加权求和)。

  2. 按照总分从高到低进行排序。

  3. 若出现多个 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. 插件名称不同:例如 1.24 + 版本中的NodeResourcesBalancedAllocation,在 1.23.6 版本中为BalancedResourceAllocation。

  2. 默认权重调整:部分插件的权重在新版本中有所变动。

  3. 插件默认状态:如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

七、优化调度策略的建议

  1. 合理设置 Node 标签和污点:借助 NodeAffinity 和 TaintToleration 引导 Pod 的调度方向。

  2. 优化资源请求配置:精确设置 requests 和 limits,避免资源的浪费。

  3. 利用 Pod 间亲和性 / 反亲和性:可将相关 Pod 调度到同一 Node,或者分散到不同 Node。

  4. 监控调度性能:通过 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

http://www.dtcms.com/a/273373.html

相关文章:

  • 多商户商城系统源码选型指南:开源 vs 定制,哪种更适合?
  • 救回多年未用kubeadm搭建的kubernetes集群
  • 5. isaac sim4.2 教程-Core API-操作机械臂
  • 用黑盒测试与白盒测试,读懂专利审查的 “双重关卡”​​
  • K8S的CNI之calico插件升级至3.30.2
  • 深度学习中的 Seq2Seq 模型与注意力机制
  • 解释sync.WaitGroup的用途和工作原理。在什么情况下应该使用它?
  • 时间显示 蓝桥云课Java
  • Android ViewBinding 使用与封装教程​​
  • Netron的基本使用介绍
  • UNet改进(20):融合通道-空间稀疏注意力的医学图像分割模型
  • 客户频繁问询项目进度,如何提高响应效率
  • Java 中的多线程实现方式
  • Spring AI 系列之八 - MCP Server
  • NFS文件存储及部署论坛(小白的“升级打怪”成长之路)
  • (鱼书)深度学习入门2:手搓感知机
  • PostgreSQL创建新实例并指定目录
  • 下一代防火墙混合模式部署
  • Jupyter介绍
  • MySQL事务实现原理
  • SpringCloud系列 - 分布式锁(八)
  • html页面,当鼠标移开A字标就隐藏颜色框
  • Spring Boot项目中大文件上传的优化策略与实践
  • 华为鸿蒙3.0 4.0完全关闭纯净模式的方法以及临时绕过纯净模式检测的方法
  • 接口(上篇)
  • 基于深度学习的自动调制识别网络(持续更新)
  • 亚洲牧原:活跃行业交流,延伸公益版图,市场拓展再结硕果
  • 布隆过滤器原理
  • 我的世界模组开发——机械动力的渲染(4)
  • java-io流