kubernetes源码学习之kube-scheduler

news2024/10/6 14:26:47

kube-scheduler是kubernetes中的调度程序,负责从api server中获得待分发的pod列表,并为他们找到最合适运行的Node。
基于kubernetes 1.27

基本框架

下面是kubernetes官发给出的框架图,先对kubernetes pod调度的大致流程有一个认识
在这里插入图片描述

看一下有了初步的印象之后,再简单看看里面的操作流程。

调度逻辑里面一共有4个关键的步骤:

  • filter
    预选,过滤掉不满足pod运行条件的Node。包括prefilter、filter、postfilter。
    • prefilter 初步过滤,包括一些基础的标准或规则,更加轻量级。
    • filter 过滤条件更加复杂和耗时。
    • postfilter 常用来处理没有找到合适pod的场景,比如preempt抢占。
  • prioritize
    优选。根据优选函数对每个符合条件的Node进行打分。按照各项的分值*权重合并后,找到分值最高的Node。包括secore、prescore、normalizeScore
    • prescore 准备数据,为score提供需要的信息。
    • score 根据各个plugins计算每个节点的得分。
    • normalizeScore 在计算最终得分之前将各个plugins的得分规范化处理一次,即map-reduce的reduce部分。
  • reserve
    检测并预留node上的资源。包括reserve、unreserve、permit
    • reserve 检测和预留资源。
    • unreserve 如果某个plugin的资源不足以运行pod,则逆序unreserve之前已经reserve成功的plugins。
    • permit 准入限制。包括三个状态:approve、deny、wait。如果permit plugins返回wait,会阻塞等待一定时间才进行bind cycle操作,wait超时会变成deny,并重新调度。
  • bind
    Node绑定操作。
    • prebind 绑定前的准备工作,包括分配网络、磁盘等。
    • bind 正式的绑定操作,默认是通过更新pod的NodeName来完成。
    • postbind 善后处理。主要是清理一些关联资源、更新状态或者发送通知。

根据上面的步骤,kubernetes调度一个节点可以简化成下面流程:

  1. 获取一个待调度的Pod
  2. 并发计算每一个node是否满足pod的调度条件(执行predicate函数map),如果满足则加入到备选列表中
  3. 使用map-reduce聚合计算每一个node的分值(执行priority函数map),选出分最高的一个
  4. 如果前面没有选出可以调度的node,则进行抢占逻辑(在允许抢占的情况下)
    • 将之前调度失败的Node,预驱逐所有优先级比当前pod低的其他pod,看驱逐后是否能调度当前pod,这些node加入备选列表。
    • 将调度pod放入备选node中,再按照优先级将预驱逐的pod重新添加回来,直到node不能再选点
    • 在预驱逐过程中,计算了驱逐各个pod需要破坏多少pdb限制。最后求出各个节点如果要调度当前pod,一共需要破坏多少pdb。
    • 选出破坏pdb限制最少、所有pod优先级最高的node
    • 将调度的pod绑定到选中的Node,将需要驱逐的pod重新加到待调度列表中。
  5. 在选中的Node上预留资源,如果预留失败则pod会重新进入调度队列
  6. 预留成功后,将对Node再做一次准入校验,确定节点是否可以立刻运行当前的pod
  7. 将pod与选中的节点进行绑定

源码分析

现在咱们应该已经对scheduler的基础逻辑有了一个大概的认识了,可以深入分析源码的实现啦。
在分析前,我先给一个代码的跳转流程,方便后续阅读时可以快速找到对应代码位置

  1. 创建一个cobra终端应用(NewSchedulerCommand / cmd/kube-scheduler/app/server.go)
  2. 注册默认的配置以及调度算法并运行scheduler(runCommand / cmd/kube-scheduler/app/server.go)
  3. 初始化创建scheduler并运行(Run / cmd/kube-scheduler/app/server.go)
  4. 起两个goroutine,一个将BackoffQ的pod移到activeQ,一个将UnschedulableQ的pod移到activeQ(Run / pkg/scheduler/scheduler.go)
  5. 循环执行Pod调度,一个Pod调度完成立刻执行下一个(Run / pkg/scheduler/scheduler.go)
  6. 将一个Pod调度到Node上(scheduleOne / pkg/scheduler/schedule_one.go)
  7. 执行pod调度流程(schedulingCycle / pkg/scheduler/schedule_one.go)
    • 预选。findNodesThatFitPod
    • 优选。prioritizeNodes
  8. 如果scheduler调度失败,则执行postFilter逻辑。(RunPostFilterPlugins / pkg/scheduler/framework/runtime/framework.go)
    • postFilter包括抢占preempt(preempt / pkg/scheduler/framework/preemption/preemption.go)
  9. 占用并预留节点资源(runReservePluginReserve / pkg/scheduler/framework/runtime/framework.go)
  10. 将pod绑定到选中的Node上(bind / pkg/scheduler/scheduler.go)

后续待更新

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

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

相关文章

眼睛:来一场视觉盛宴《手拿把掐》css特效 —— 之听说过CSS【笑】

😷😊🤺🤺🤺前期回顾 打造极简风格动效 —— 5 分钟轻松实现惊艳、震撼人心的视觉效果_彩色之外的博客-CSDN博客 😁 css动画 —— 把你喜欢css动画嵌入到浏览器中_css做的动画效果怎么嵌入网页_彩色之外的…

window电脑修复网络不能正常

问题描述 问题的起点是我打开了OpenAPI公司的GPT,在回答的过程中响应很慢,然后自己开始尝试切换连接的服务器(这里使用到了网络代理),最后自己做了一个操作是 代理软件的这个菜单里面的增强模式选项,结果…

Android爬坑指南————工信部又出新规!

工信部又出新规了! 一、背景二、整改2.1 个人信息保护2.1.1 基本模式(无权限、无个人信息获取模式)腾讯视频网易云音乐 2.1.2 隐私政策内容 2.2 app权限调用2.2.1 应用内权限调用2.2.1.1 获取定位信息和生物特征识别信息2.2.1.2 其他权限 2.3…

渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢? 就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如…

SVR算法简介及与其它回归算法的关系

目录 参考链接 有人可以帮助我理解支持向量回归技术和其他简单回归模型之间的主要区别是什么 支持向量回归找到一个线性函数,表示误差范围 (epsilon) 内的数据。也就是说,大多数点都可以在该边距内找到,如下图所示 这意味着 SVR 比大多数其…

TypeScript 学习笔记(一):基本类型、交叉类型、联合类型、类型断言

文章目录 一、常见类型1. 数组2. 布尔3. 数值4. 字符串5. object6. null 和 undefined7. symbol7.1 作为属性名7.2 属性名遍历7.3 静态方法:Symbol.for()和 Symbol.keyFor()7.4 内置 symbol 值7.4.1 Symbol.hasInstance7.4.2 Symbol.isConcatSpreadable7.4.3 Symbol…

Android 报错,闪退(错误)日志保存到手机内存中,以文本文件的形式保存

1.直接贴代码 import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Environment; import android.util.Log;import com.nuotu.atmBookClient.App;import java.io.File; i…

python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)

简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理员,用的最多的是邮件。在linu…

这份4577页的Java面试PDF,让我成功斩获阿里、字节等大厂offer

我为大家准备了一份超级全面的Java 学习面试笔记,这份电子版笔记涵盖了诸多后端技术栈的面试题和答案,相信可以帮助大家在最短的时间内复习Java后端的大多数技术点和面试题,从而拿到自己心仪的offer。共4577页。整体还是比较清爽的&#xff0…

Postman的细节回顾

之前在学校摸索着玩过postman,工作后要使用postman,发现对于很多细节,这里补充说明一下,当作使用手册。 之所以使用postman,是因为更便捷的查看接口情况,不需要每次在浏览器f12查看。 目录 1 创建请求2 测…

产品经理怎么管理项目进度?

作为在职七年的项目管理人员,在项目进度管理上确实有一点发言权。产品经理作为企业的核心骨干岗位之一,在进行项目进度管理时也会有很多问题出现,那么应该怎样去管理项目进度呢?以下是答主的一些拙见,有需要的朋友们就…

C. Particles

Problem - C - Codeforces 思路:通过题意能够知道如果移除i,那么i-1与i1会合成一个新的,同时后面的往前移动两个单位,并且我们发现可以让1 3 5 7 ... 2*n-1合成一个数,让2 4 6 8 ... 2*n合成一个数,同时我们…

java自我学习记录day02

java日常学习 1.继承2.super3.方法重写/覆盖4.多态5.Object类和equals的对比equals用于判断值是否相等hashCode方法toString方法finalize方法 6.刷题(03)题三:在排序数组中查找元素的第一个和最后一个位置 1.继承 如果希望指定去调用父类的某…

uniapp 小程序 filters 过滤日期

页面效果&#xff1a; <template><view class"order-intro-item"><text class"left-label">日期</text><text class"right-info time-text">{{startClearingTime | formatData}} 至 {{endClearingTime | format…

21. 斐波那契数列

链接&#xff1a; 链接 题目&#xff1a; 输入一个整数 nn &#xff0c;求斐波那契数列的第 nn 项。 假定从 00 开始&#xff0c;第 00 项为 00。 数据范围 0≤n≤390≤n≤39 样例 输入整数 n5 返回 5 思路&#xff1a; 0返回0&#xff0c;1&#xff0c;2都返回1&#xff0c;后…

数据库备份恢复和索引视图

样例表如下&#xff1a; /***************************样例表***************************/CREATE DATABASE booksDB;use booksDB;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL);INSERT INTO booksVALUES (1107…

IPv6 over IPv4 之SIT隧道

一.SIT模块功能简介 SIT模块是支持ISATAP隧道和6to4隧道两种隧道模式的 ISATAP和6to4都是目前比较流行的自动建立隧道的过渡技术&#xff0c;都可以连接被IPv4隔绝的IPv6孤岛&#xff0c;都是通过将IPv4地址嵌入到IPv6地址当中&#xff0c;并将IPv6封包封装在IPv4中传送&…

第一章介绍处理器(Cortex-M7 Processor)

目录 第一章引言本章介绍处理器。 1.1关于Cortex-M7处理器 1.1.1特性 1.1.2接口 1.1.3配置选项 1.2组件模块 1.2.1数据处理单元 1.2.2预取单元 1.2.3负载存储单元 1.2.4浮点单元 1.2.5嵌套矢量中断控制器 1.2.6唤醒中断控制器 1.2.7记忆系统 1.2.8存储缓冲区 1.2.9内…

从数据中看天气变迁:Python获取历史天气数据

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 需要知识点 : 动态数据抓包 requests发送请求 结构化非结构化数据解析 开发环境 : python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 requests 发送请求 pip install requests parsel 解析数据 pip inst…

cuda中radix_sort

背景 radix_sort排序是一种经典排序&#xff0c;在gpu上都有对其进行支持&#xff0c;这里主要参考cub中的实现&#xff0c;简单介绍一种单block的情形, 本文只适合看过源码但是没有看懂的同学。 流程 在second step中完全实在ScanCounters()函数中&#xff0c;具体分为upswe…