K8S的Scheduler 原理

1. 预选策略(xxx Predicates)

目的:筛选出符合要求的节点

1.1 NoDiskConflict

目的:判断备选pod中 gccPersistentDisk等和备选节点已有Pod是否冲突

1.2 PodFitsResources

目的:节点资源是否满足pod需求

1.3 PodSelectorMatches

目的:判断备选节点是否包含(Pod标签选择器的)指定标签

1.4 PodFitsHost

目的:判断Pod指定节点名(spec.nodeName)指定节点是否和备选节点一致

1.5 CheckNodeLaberPresence

目的:如果指定该策略,Scheduler将注册该策略。其用于判断策略列出的标签在备选节点中存在时,是否选择该节点。

流程如下:

  • 读取备选节点标签列表
  • 根据策略判断:
    在这里插入图片描述

可理解为presence:true为白名单,presence:false为黑名单

1.6 CheckServiceAffinity

如果用户指定该策略,则会判断Pod的亲和度(详情见文集《k8s-进阶》中《pod的亲和度调度》一片)

1.7 PodFitsPorts

目的:判断端口是否被调用。

2. 优选策略(xxx Priority)

目的:计算每个候选节点的积分已得到最高者。(调度的最终判断)

2.1 LeastRequestedPriority

按资源消耗给节点打分(小的分高)

计分规则大致如下:

score=int(((nodeCpuCapacity-totalMilliCPU)\*10)/nodeCpuCapacity+((nodeMemoryCapacity-totalMemory)\*10)/NodeCpuMemory)/2)

参数说明:

  • nodeCpuCapacity:节点CPU数。
  • nodeMemoryCapacity:节点内存大小。
  • totalMilliCPU:所有备选节点上运行的Pod和备选Pod的CPU占用量
  • totalMemory:所以备选节点上运行的Pod和备选Pod的CPU占用量

改成数学式表示:
在这里插入图片描述

2.2 CalculateNodeLabelPriority

目的:如果用户指定该策略,Scheduler将注册该策略。其用于判断是否给该节点加分。

判断策略如下:
在这里插入图片描述

2.3 BalancedResource

目的:按各项资源使用率均衡度打分(均衡分高)

计算规则大致如下:

score=int(10-math.abs(totalMilliCPU/nodeCpuCapacity-totalMemory/nodeMemoryCapacity)\*10)

参数同2.1

改成数学式表示:
在这里插入图片描述


posted on   运维开发玄德公  阅读(22)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示