Kubernetes 调度器 详解

1. 调度器在 K8s 中的位置与核心流程

API Server ←→ etcd ←→ kube-scheduler ←→ kubelet

  1. 创建:用户提交 Pod 描述(YAML/Helm/Operator)。

  2. 监听:调度器通过 Watch 机制捕获到 spec.nodeName="" 的 Pod。

  3. 过滤:根据资源、污点、亲和性等“硬性条件”过滤出可行节点(Feasible Nodes)。

  4. 打分:对可行节点按策略打分,最高分胜出。

  5. 绑定:将 spec.nodeName 写入 Pod 对象,目标节点的 kubelet 开始真正启动容器。

  6. 重调度:节点故障或资源不足 → 删除原 Pod → 回到步骤 2。

调度器是控制面唯一的“决策大脑”,但它不做网络/存储分配;它只是给 Pod 选“座位”。


2. 调度方式全景图

级别方法典型场景备注
强制nodeName排障、DaemonSet优先级最高,绕过调度器
标签nodeSelector指定 gpu=true、ssd=true简单,功能有限
亲和nodeAffinity软/硬亲和支持 In/NotIn/Gt/Lt/Exists
Pod 间podAffinity / podAntiAffinity同域部署、打散需大量计算,大集群慎用
污点taint + toleration隔离生产/测试、驱逐NoSchedule / PreferNoSchedule / NoExecute
高级多调度器、扩展器、Score 插件自定义算法自 1.19 支持 Scheduling Framework

3. 手把手实战:从简单到高阶

3.1 nodeName —— 一把梭,但风险高

apiVersion: v1
kind: Pod
metadata:name: one-shot-tool
spec:nodeName: k8s-node2      # 直接绑定,不经过调度器containers:- name: debugimage: alpine:latestcommand: ["sleep", "3600"]

缺点:节点不存在或资源不足时直接 Pending,调度器不会帮你重试。


3.2 nodeSelector —— 80% 场景已够用

# 给节点打标签
kubectl label node k8s-node1 disktype=ssd zone=beijing
spec:nodeSelector:disktype: ssdzone: beijing

小技巧:对同一类节点批量打标签 kubectl label node -l node-role.kubernetes.io/worker= tier=frontend


3.3 nodeAffinity —— 软/硬策略组

  • nodeaffinity支持多种规则匹配条件的配置如

匹配规则功能
lnlabel 的值在列表内
Notlnlabel 的值不在列表内
Gtlabel 的值大于设置的值,不支持Pod亲和性
Ltlabel 的值小于设置的值,不支持pod亲和性
Exists设置的label 存在
DoesNotExist设置的 label 不存在
affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:   # 必须满足nodeSelectorTerms:- matchExpressions:- {key: disktype, operator: In/NotIn(#在节点中或不在), values: ["ssd"]}preferredDuringSchedulingIgnoredDuringExecution:  # 尽量满足- weight: 50preference:matchExpressions:- {key: zone, operator: In, values: ["beijing"]}
  • IgnoreDuringExecution:节点标签变更后,已运行 Pod 不动。

  • 支持 Gt/Lt 做资源范围筛选,如 cpu 核数大于 32。


3.4 Pod 间亲和与反亲和

  • 那个节点有符合条件的POD就在那个节点运行

  • podAffinity 主要解决POD可以和哪些POD部署在同一个节点中的问题

  • podAntiAffinity主要解决POD不能和哪些POD部署在同一个节点中的问题。它们处理的是Kubernetes集群内部POD和POD之间的关系。

  • Pod 间亲和与反亲和在与更高级别的集合(例如 ReplicaSets,StatefulSets,Deployments 等)一起使用时,

  • Pod 间亲和与反亲和需要大量的处理,这可能会显著减慢大规模集群中的调度。

3.4.1 亲和:主要解决POD可以和哪些POD部署在同一个节点中的问题

3.4.2 反亲和:主要解决POD不能和哪些POD部署在同一个节点中的问题

经验值:大规模集群开启 topologyKey: topology.kubernetes.io/zone 可实现跨可用区打散。


3.5 Taint & Toleration —— 隔离与驱逐双杀

3.5.1 概念
  • Taints(污点)是Node的一个属性,设置了Taints后,默认Kubernetes是不会将Pod调度到这个Node上

  • Kubernetes如果为Pod设置Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去

  • 可以使用命令 kubectl taint 给节点增加一个 taint:

$ kubectl taint nodes <nodename> key=string:effect   #命令执行方法
$ kubectl taint nodes node1 key=value:NoSchedule    #创建
$ kubectl describe nodes server1 | grep Taints        #查询
$ kubectl taint nodes node1 key-                  #删除

其中[effect] 可取值:

effect作用常用场景
NoSchedule新 Pod 不来GPU 节点仅跑 AI 任务
PreferNoSchedule尽量不调度线上节点留有余量
NoExecute已运行 Pod 驱逐节点维护、内核升级
3.5.2 实战:

测试污点容忍,node1,node2都设置为NoSchedule

未设置容忍的则显示为pending


4. 调度器扩展:自定义策略与性能

4.1 多调度器

当默认调度器无法满足业务场景(如 GPU Binpack、Spark 动态资源)时,可部署自定义调度器并指定:

spec:schedulerName: volcano

4.2 Scheduling Framework(1.19+)

通过插件链在 PreFilter / Filter / Score / Reserve / Permit / Bind 阶段插入自定义逻辑,无需重编 kube-scheduler。
示例:NodeResourcesFit、PodTopologySpread、Coscheduling(gang scheduling)。

4.3 性能调优

  • 大规模集群建议开启 percentageOfNodesToScore(默认 50%),减少打分节点数量。

  • 监控指标:scheduler_binding_duration_secondsscheduler_scheduling_attempt_duration_seconds


5. 排查 Pod 无法调度的一页速查

现象可能原因排查命令
Pending资源不足kubectl describe pod → Events
Pending节点污点kubectl get node -o json | jq '.items[].spec.taints'
Pending亲和冲突kubectl get pod -o wide 查标签
PendingPVC 未绑定kubectl get pvc
Node Lost节点 NotReadykubectl get node, 查 kubelet / 网络 / 磁盘

6. 总结与最佳实践

  1. 90% 场景
    nodeSelector + nodeAffinity + podAntiAffinity 即可满足。

  2. 污点策略
    • 生产节点:dedicated=production:NoSchedule
    • 测试节点:env=test:PreferNoSchedule

  3. 大规模集群
    • 避免 topologyKey 过细,减少计算量。
    • 使用 namespace + 污点做物理隔离,而非反亲和暴力打散。

  4. 持续治理
    • 每个季度 review 节点标签、污点、调度策略。
    • 用 Gatekeeper / Kyverno 做策略即代码(Policy as Code)。


附录:一键清理实验资源
kubectl delete pod,deploy --all --grace-period=0 --force

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93988.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51.Seata-TCC模式

前面两种XA模式和TA模式,都是用了加锁。 TCC模式则不会加锁,性能更好。 TCC模式跟AT模式非常相似, 1.AT模式下,第一阶段直接提交事务。 2.TCC模式下,第一阶段不是提交事务,而是资源的预留冻结。 不同的是二阶段TCC通过人工编码来实现数据恢复。 需要实现三个方法 …

什么是数据分类分级?数据分类分级技术实现路径及产品推荐

什么是数据分类分级&#xff1f; 数据分类分级是指按照一定的原则、方法和标准&#xff0c;对数据进行系统化的类别划分和级别确定。具体而言&#xff0c;数据分类是依据数据的属性、特征、来源、用途等维度&#xff0c;将数据划分为不同的类别&#xff0c;如按照业务领域可分为…

深度学习——神经网络

在当今人工智能蓬勃发展的时代&#xff0c;深度学习和神经网络已经成为最受关注的技术领域之一。从智能手机的人脸识别到自动驾驶汽车的环境感知&#xff0c;从医疗影像分析到金融风险预测&#xff0c;这些技术正在深刻改变我们的生活和工作方式。本文将带您了解深度学习和神经…

uniapp image标签展示视频第一帧

?vframe/jpg/offset/1/ 加到视频后面获取第一帧图片 ?vframe/jpg/offset/1/w/400/h/300 设置宽高 ?imageView2/0/w/2000/interlace/1 设置图片分辨率 2000 // 后面的 /1/ 是第几帧 <image class"thumb" :src"videoUrl?vframe/jpg/offset/1/" mode…

前端本地模糊搜索1.0 按照匹配位置加权

需求背景 公司项目为Saas ERP系统&#xff0c;客户需要快速开单需要避免接口带来的延迟问题。所以需要将商品数据保存在本地。所以本地搜索 权重 这一套组合拳需要前端自己实现。 搜索示例 示例1&#xff1a;输入&#xff1a;"男士真皮钱包"进行模糊匹配优先匹配完全…

Linux学习-网络编程2

1.tcp可能出现粘包解决&#xff1a;要让消息之间有边界1.结束标志 \r\n2.固定长度3.协议结构体2.recv和sendrecv原型&#xff1a;ssize_t recv(int sockfd, void *buf, size_t len, int flags); 功能&#xff1a;从sockfd接收信息 参数&#xff1a;sockfd&#xff1a;要…

【普通地质学】构造运动与地质构造

名词解释走向&#xff1a;倾斜的层面与水平面的交线走向线&#xff0c;走向线两端延伸的方向即为走向&#xff1b;构造运动&#xff1a;由于地球内部动力引起的组成岩石圈物质的机械运动&#xff0c;也可称地壳运动或岩石圈运动&#xff1b;按方向分为垂直运动和水平运动&#…

基于Python的旅游推荐系统 Python+Django+Vue.js

本文项目编号 25009 &#xff0c;文末自助获取源码 \color{red}{25009&#xff0c;文末自助获取源码} 25009&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 用户功能描述1.2 管理员功能描述 二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…

基于51单片机的智能加湿器设计 温湿度水位防干烧手动自动声光报警

1 系统功能介绍 本设计实现了一种 基于 51 单片机的智能加湿器控制系统。随着现代生活水平的提高&#xff0c;人们对居住和办公环境的舒适度要求越来越高&#xff0c;空气湿度和温度的调节逐渐成为家庭和办公自动化的重要组成部分。传统加湿器仅能实现简单的加湿功能&#xff0…

开发避坑指南(31):Oracle 11g LISTAGG函数使用陷阱,缺失WITHIN子句解决方案

错误信息 Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-02000: 缺失 WITHIN 关键字查询语句 使用LISTAGG函数将多行数据合并为单行字符串&#xff0c;如下&#xff1a; selectt.order_no as orderNo,t.account_no,(select listagg(a.bank_name,,) …

【虚拟化】磁盘置备方式的性能损耗对比

【虚拟化】磁盘置备方式的性能损耗对比摘要1、定义1.1厚置备&#xff08;Thick Provisioning&#xff09;1.2厚置备延迟置零&#xff08;Thick Provisioned Lazy Zeroed&#xff09;1.3厚置备置零&#xff08;Thick Provisioned Eager Zeroed&#xff09;2、对比摘要 探索三种…

计算机网络:TCP、UDP

一、TCP粘包问题&#xff08;一&#xff09;什么是粘包&#xff1f;TCP粘包是指发送方发送的多个数据包在接收方接收时被合并成一个大的数据包的现象。这种现象是由于TCP协议本身的特性导致的&#xff0c;TCP是面向流的协议&#xff0c;数据在传输过程中没有明确的边界。&#…

使用 Google 开源 AI 工具 LangExtract 进行结构化信息抽取

导读&#xff1a;本文介绍科技大厂 Google 2025年 7 月最新开源的 Python 库&#xff1a;LangExtract&#xff0c;用于从非结构文本提取结构化数据&#xff0c;以及非官方的 Javascript、Rust 语言实现版本。 文章目录一、关于 LangExtract1.1 需求痛点1.2 LangExtract1.3 参考…

把 AI 变成「会说话的盲道」——基于骨传导的地砖级语音导盲砖

标签&#xff1a;城市无障碍、骨传导、TinyML、语音导航、太阳能、离线推理、ESP32-C3、边缘 AI ---- 1. 背景&#xff1a;为什么盲道要开口说话&#xff1f; 全国 1700 万视障者&#xff0c;城市道路却常出现&#xff1a; • 盲道被违停车、广告牌截断&#xff1b; • 传统导…

解析三品汽车零部件PLM系统解决方案:如何助力行业解决研发管理难题

2024年&#xff0c;全球汽车零部件市场规模超1.5万亿美元&#xff0c;中国市场规模达4.6万亿元人民币。产业繁荣高度依赖汽车产业的发展&#xff0c;2024年中国汽车产销量均突破3100万辆&#xff0c;新能源汽车销量约1286万辆&#xff0c;2019-2024年复合增长率达76.59%。当前行…

【RA-Eco-RA4E2-64PIN-V1.0 开发板】步进电机驱动

【RA-Eco-RA4E2-64PIN-V1.0 开发板】步进电机驱动 本文介绍了 RA-Eco-RA4E2-64PIN-V1.0 开发板驱动 28BYJ-48 步进电机的设计。 项目介绍 硬件连接&#xff1a;28BYJ-48 步进电机、ULN2003 驱动板、Jlink 调试器等&#xff1b;工程创建&#xff1a;GPIO 和 UART 的配置&#xf…

机器人爆发、汽车换代,速腾聚创开始讲新故事

文&#xff5c;刘俊宏编&#xff5c;王一粟2025年智能汽车出货量激增&#xff0c;堪称“智驾安全带”的激光雷达&#xff0c;迎来了自己的iPhone时刻。8月21日&#xff0c;速腾聚创发布了2025年第二季度及中期业绩报告&#xff0c;激光雷达的中场战事得以一并揭开。速腾聚创二季…

在Excel和WPS表格中如何隐藏单元格的公式

Excel和WPS表格中有数据、公式、图表等以后&#xff0c;要发给他人查阅&#xff0c;如果不希望表格中的公式被查阅和修改&#xff0c;我们可以通过两个步骤把公式隐藏起来。先设置有公式的单元格格式为隐藏&#xff0c;然后保护工作表即可。第一步&#xff1a;设置单元格格式为…

Eino 开源框架全景解析 - 以“大模型应用的搭积木指南”方式理解(一)

Eino 开源框架全景解析 - 大模型应用的搭积木指南 &#x1f3af; 什么是 Eino&#xff1f;一句话概括 Eino 是字节跳动开源的大语言模型应用开发框架&#xff0c;就像是一个专门为 AI 应用设计的"搭积木工具箱"&#xff0c;让开发者能够像搭乐高一样轻松构建复杂的 A…

大语言模型原理(Transformer架构)

一、概览1.1 定义大语言模型&#xff08;LLM&#xff09;是基于深度学习和神经网络的自然语言处理技术&#xff0c;目前主要通过Transformer架构和大规模数据训练来理解和生成语言。GPT不同架构的训练参数&#xff1a;GPT-1(2018)&#xff1a;1.17亿参数GPT-2(2018)&#xff1a…