两张大图一次性讲清楚k8s调度器工作原理

作者:有态度的下等马日期:2025/10/26

面试常被追问k8s调度器工作原理,一图胜10086句言,收藏 == 学废。😣😣

kube-scheduler负责将k8s pod调度到worker节点上。

当你部署pod时,在manifest文件pod规格上会指定cpu、memory、亲和性affinity、污点taints、优先级、持久盘等。

调度器的主要工作是识别create request然后选择满足要求的最佳节点。

分步解释:

  1. Pod Create Request: 外部系统(kubectl、cicd)发出了创建一个新pod的请求。
  2. kube-api server收到请求,然后将pod状态保存到etcd(集群的分布式kv存储)。
  3. api server给外部系统回发确认信息。
  4. kube scheduler持续监听unassignedods (使用watch机制),注意到新的pod。

4.1. scheduler会根据pod的规格(cpu、memory、亲和性)决定pod应在哪个节点上运行,并创建pod-node binding,它会将此绑定决定通知api server。

  1. scheduler更新etcd中pod的状态(通过api server): ① 标记pod为“scheduled”状态 ② 记录被分配的节点。
  2. 被选中节点上的kubelet, 也会持续监听新pod分配(使用watch机制),侦测到最新的已经分配的pod。
  3. kubeletapi server拉取pod manifest信息, 内容包含启动需要的镜像、volume、网关配置。
  4. kubelet指示容器运行时为pod启动容器。
  5. kubelet 通知apiserver: 现在 pod 已与节点绑定。
  6. api server更新etcd 中pod的最终状态,确保当前状态正确反映到集群数据库etcd。

4.1 kube-scheduler是如何选中节点?

在k8s集群,会存在不止一个节点,scheduler是如何从所有worker节点中选中节点。

scheduler一般包含两阶段:

  • 调度期
  • 绑定期

调度期

在这个时期,kueb-scheduler使用过滤打分策略选择最佳节点。

过滤Filtering :cheduler找到pod能被调度的最合适的节点。

从本质上讲,它会利用pod规格(cpu、memory、亲和性、污点、持久盘)过滤掉不适合运行特定pod的节点。

对于大集群, 过滤之后, 也不会对剩下的所有节点都做打分。
scheduler有一个配置参数percentageOfNodesToScore决定了参与打分的节点比例。 默认值取决与集群大小:小集群50%--->大集群5%

即使这个百分比被设置的很小,scheduler会持续搜索直到找到了𝗺𝗶𝗻𝗙𝗲𝗮𝘀𝗶𝗯𝗹𝗲𝗡𝗼𝗱𝗲𝘀𝗧𝗼𝗙𝗶𝗻𝗱数量。

Scoring: 给节点打分, scheduler给节点排名

k8s使用Priorities(Scorers)来给节点打分,打分机制通过各种scheduling 插件来实现。

  1. pod priority: 高优先级的pod通过影响打分过程影响节点选择(高优Pod会先于低优Pod被调度)。
  2. pod拓扑分布: 确保 pod 分布在不同的拓扑域(如区域或节点)中,避免在一个地方集中过多pod。

scheduler通过调用多个调度插件给节点打分, 每个插件都会根据特定标准对节点进行评估,并累计到最终得分。

最后,排名最高的worker节点会被选中调度pod。如果所有节点的排名相同,则会随机选择一个节点。

一旦节点被选中,调度器在api server创建了binding event(pod+node)。

绑定期

scheduler尝试将pod绑定到得分最高的节点,如果绑定失败,scheduler一般会选用次高得分的节点。


自定义Scheduler

开发者可以创建自定义scheduler,在集群内和原生调度器一起运行。

当部署pod时,可以在pod manifest文件指定自定义的Scheduler, 这样调度器的调度决定就会基于你自定义的调度逻辑。

Pluggable Scheduling Framework

调度器有一个可插拔的调度框架,这意味着开发者可以在调度工作流中添加自定义的插件。


两张大图一次性讲清楚k8s调度器工作原理》 是转载文章,点击查看原文


相关推荐


LeetCode第1710题 - 卡车上的最大单元数
小南家的青蛙2025/10/23

题目 解答 class Solution { public int maximumUnits(int[][] boxTypes, int truckSize) { Arrays.sort(boxTypes, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o2[1] - o1[1]; } });


MySQL的整体架构及功能详解
程序新视界2025/10/22

在前面的系列文章中,我们讲解了MySQL基础功能相关的知识,在这篇文章中,重点讲讲MySQL的整体架构,以便在后续的学习中更好的了解所讲的功能属于MySQL的哪一部分,以及前后相关的工作流程。 MySQL整体架构图 这里我们以MySQL官方提供的整体架构图为基准,确保知识的权威性和准确性。 通过上图,我们可以看到,MySQL架构设计总共分为四层,分别是客户端层,服务层,存储引擎层与系统文件层。 下面,我们就来看看各层的详细功能及特性。 客户端层 客户端层是MySQL架构中的最顶层,即架构图中的


SpringBoot “分身术”:同时监听多个端口
风象南2025/10/21

前言 在日常开发中,我们通常构建的 Spring Boot 应用都是"单面"的——一个端口,一套服务逻辑。但在某些实际场景中,我们可能需要一个应用能够"一心二用":同时提供两套完全不同的服务,分别在不同的端口上运行。 比如: 一个端口面向外部用户,提供 API 服务 另一个端口面向内部管理,提供监控和运维功能 或者在一个应用中同时集成管理后台和用户前台 场景示例 假设我们要开发一个电商平台,需要同时满足: 用户端服务(端口8082) 商品浏览 购物车管理 订单处理 管理端服务(端口808


LeRobot 机器人学习(Robot Learning)入门教程(一)
具身智能与人形机器人2025/10/19

系列文章目录 目录 系列文章目录 前言 一、前言 二、引言 2.1 LeRobotDataset 2.1.1 数据集类的设计 2.2 代码示例:批处理(流式)数据集 2.2.1 批处理(流式)数据集 2.3 代码示例:收集数据 2.3.1 记录数据集 前言         机器人学习正处于一个转折点,这得益于机器学习的快速进步以及大规模机器人数据日益普及。这种从经典的基于模型的方法向数据驱动、基于学习的范式转变,正在为自主系统释放前所未有的能力。本教程全面梳理现代机


如何检查本地是否存在 Docker 镜像 ?
鸠摩智首席音效师2025/10/18

当我们深入研究 Docker 的功能时,发现 Docker 不仅仅是一项技术,这是一个充满镜像、容器和数据卷的宇宙。今天我们戴上侦探帽,调查一个看似简单却至关重要的案件:识别本地是否存在某个 Docker 镜像。这可能看起来微不足道,但通常是维持高效工作的关键步骤,特别是在复杂的 Docker 环境中。 什么是 Docker 镜像 ? 首先,让我们简单地定义一下什么是 Docker 镜像。在 Docker 生态系统中,镜像是轻量级的、独立的、可执行的包含运行一个软件所需的一切的软件包,包括代


.net8.0_webapi 生成二维码
焚 城2025/10/17

文章目录 一、思路二、实现1、Program.cs2、二维码辅助类QrCodeHelper.cs 三、效果保存后: 一、思路 环境: 1、内容生成二维码图片 2、保存到wwwroot为png格式 3、返回存储路径保存到数据库 4、前端读取显示 二、实现 1、Program.cs //配置静态文件路径 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(


axios请求
梦6502025/10/15

安装 Axios 在项目中安装 Axios 依赖,可以通过 npm 或 yarn 进行安装。 npm install axios 或 yarn add axios 引入 Axios 在需要使用 Axios 的文件中引入 Axios。 import axios from 'axios'; 发起 GET 请求 使用 Axios 发起 GET 请求,获取数据。 axios.get('https://api.example.com/data') .then(response


公开一个AI产品的商业逻辑与设计方案——AI带来的涂色卡自由
华洛2025/10/14

我孩子正是玩涂色绘本的年纪,我每年给她买绘本的开销就要几百块钱。 涂色绘本这东西也没啥,就是某个角色的线稿,让儿童发挥想象涂色用。 高级一点的,还会给你一个参照的涂好颜色的形象,就是下面图上这种: 每年花个几百块钱虽然不多,但是也总觉的不值,而且绘本的角色、形象都是固定的,孩子想玩的多一次就要买很多本。 直到前几个月开始,我开始自己用AI做线稿图,打印后带给孩子涂色。我发现了一个事情: 孩子的快乐一点都没少,甚至快乐加倍了! 以前买一本拉布布就涂几张,不感兴趣了,扔一边就去涂公主。 现在完全不


设计模式-迭代器模式
紫菜紫薯紫甘蓝2025/10/13

设计模式-迭代器模式 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern),用来给类实例提供一种遍历对象的方式。 案例分析 首先写一个经典的 User 类 @Data @ToString public class User { private String uuid; private String name; private Integer age; } 通常我们遍历一个对象有三种方式 pub


医疗设备控制系统中同步与异步通信的架构设计
oioihoii2025/10/11

在医疗设备控制系统的开发过程中,我们面临一个经典的技术挑战:如何在保持用户界面流畅响应的同时,可靠地处理设备控制的长时间操作。本文将通过一个医疗床控制系统的实际案例,分享我们在同步与异步通信架构设计上的解决方案。 问题场景 我们的医疗床控制系统采用主从架构:Host(主控端)与EPC(设备控制单元)通过双端口通信: Command端口:用于发送控制命令和接收立即响应 Event端口:用于接收异步的执行结果和状态更新 关键需求: 用户点击"移动病床"按钮后,需要等待设备执行完成(可能耗时数十

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0