K8s 是如何完成调度和权重调整?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、调度流程
- 二、kuble-scheduler 调度原理
- 1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析
- 2 修改调度器插件默认权重示例
- 2.1 环境准备
- 2.2 调整InterPodAffinity权重,使工作负载test调度至节点k8s-0002
- 2.3 调整NodeAffinity权重,使工作负载test调度至节点k8s-0001
前言
kube-scheduler作为 K8s 集群的默认调度器,它监听(watch机制)kube-apiserver,查询还未调度的 pod,根据调度策略将 pod 调度至集群内最适合的Node。
提示:以下是本篇文章正文内容,下面案例可供参考
一、调度流程
首先我们通过 API 或者 kubectl 工具创建 pod,kube-apiserver 收到请求信息存储到 etcd 中,调度器通过 watch 机制监听 apiserver 查看到还未被调度的 pod 列表,循环遍历的为每个 pod 尝试分配 node,这个分配过程如下:
- kube-scheduler 内 Informer 组件 list-watch apiserver,使用spec.nodeName=""筛选出还未调度的 Pod
- 预选(predicate):调度器通过 Predicate 算法过滤掉不满足条件的节点
- 优选(priorlty):对于通过预选的节点,通过打分机制,筛选出得分最高的node
- 当调度器为 Pod 选择了一个合适的节点后,将 Pod 和节点进行绑定(将节点名称赋值给 pod 的 spec.nodeName 字段)
注意:Pod.spec.nodeName 用于强制约束将 Pod 调度到指定的 Node上,通过指定 nodeName 可直接绕过调度器,并不会做任何的资源过滤和检查。
二、kuble-scheduler 调度原理
Kube-scheduler 的调度框架,在 Kubernetes 里面叫作 Scheduler Framework。Pod 在调度过程中,都需要依次经过以下的各个阶段,每个阶段自带调度算法,调度算法由插件提供,也可以在指定阶段开发自己的插件。每个插件可以在指定阶段实现具体的调度算法,比如 NodeAffinity 插件在 Filter 阶段过滤掉与 Pod 不亲和的节点。
- PreFilter:预处理 Pod 的相关信息,或者检查集群或 Pod 必须满足的某些条件。如果 PreFilter 插件返回错误,则调度周期将终止
- Filter: 过滤出不能运行该 Pod 的节点。对于每个节点,调度器将按照其配置顺序调用这些过滤插件。如果任何过滤插件将节点标记为不可行,则节点直接排除,不会为该节点调用剩下的过滤插件
- PostFilter: 在 Filter 阶段后调用,但仅在该 Pod 没有可行的节点时调用。典型的后筛选实现是抢占,试图通过抢占其他 Pod 的资源使该 Pod 可以调度
- PreScore: 运行评分任务以生成可评分插件的共享状态,如果 PreScore 插件返回错误,则调度周期将终止
- Score: 通过调用每个评分插件对可调度节点评分
- NormalizeScore: 规范每个插件的打分在[0,100]之间
- Reserve: 在绑定周期之前选择保留的节点
- Permit: 批准或拒绝 pod 调度周期的结果
- PreBind: 用于执行 Pod 绑定前所需的任何工作。例如,一个预绑定插件可能需要提供网络卷并且在允许 Pod 运行在该节点之前 将其挂载到目标节点上
- Bind: 用于将 Pod 绑定到节点上。直到所有的 PreBind 插件都完成,Bind 插件才会被调用
- PostBind: 这是个信息性的扩展点。绑定后插件在 Pod 成功绑定后被调用。这是绑定周期的结尾,可用于清理相关的资源
调度器预选阶段对应filter,主要用于过滤不满足 Pod 调度条件的节点;优选阶段对应 score,主要用于为每个节点打分,节点分数=插件打分*插件权重;然后排序选出分数最高的节点。
1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析
2 修改调度器插件默认权重示例
2.1 环境准备
环境:(集群中有两个节点:k8s-0001和 k8s-0002;已有工作负载 nginx,调度至节点 k8s-0002,工作负载 test),yaml 文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: test
spec:selector:matchLabels:app: testtemplate:metadata:labels:app: testspec:containers:- name: container-1image: nginx:latestdnsPolicy: ClusterFirstaffinity:nodeAffinity: #利用节点亲和使其调度至k8s-0001preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-0001podAffinity: #利用负载亲和使其调度至k8s-0002preferredDuringSchedulingIgnoredDuringExecution:- weight: 1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxnamespaces:- defaulttopologyKey: kubernetes.io/hostnam
2.2 调整InterPodAffinity权重,使工作负载test调度至节点k8s-0002
apiVersion: v1
kind: ConfigMap
metadata:name: scheduler-confignamespace: kube-system
data:scheduler-config.yaml: |apiVersion: kubescheduler.config.k8s.io/v1beta3 #1.23以上版本集群可用v1beta3kind: KubeSchedulerConfigurationprofiles:- schedulerName: default-scheduler plugins:score:disabled:- name: InterPodAffinity- name: NodeAffinityenabled:- name: InterPodAffinity #提高负载亲和权重weight: 100- name: NodeAffinityweight: 1
查看 kube-scheduler 调度日志,k8s-002 score得分为打分100 * 权重 100共得10000分,调度到 k8s-002 节点上。
2.3 调整NodeAffinity权重,使工作负载test调度至节点k8s-0001
apiVersion: v1
kind: ConfigMap
metadata:name: scheduler-confignamespace: kube-system
data:scheduler-config.yaml: |apiVersion: kubescheduler.config.k8s.io/v1beta3kind: KubeSchedulerConfigurationprofiles:- schedulerName: default-scheduler plugins:score:disabled:- name: InterPodAffinity- name: NodeAffinityenabled:- name: InterPodAffinityweight: 1- name: NodeAffinity #提高节点亲和权重weight: 100
相关文章:

K8s 是如何完成调度和权重调整?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、调度流程二、kuble-scheduler 调度原理1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析2 修改调度器插件默认权重示例2.1 环境准备2.2 调整Inte…...

计算机毕业设计----Springboot超市订单管理系统
项目介绍 该超市订单管理毕业设计基于jdk8版本开发,在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术, 实现了供应商管理对供应商实现增删改查、订单管理对超市订单实现增删改查、用户管理等功能,适用…...

如何给AI下达精准的指令,哪些提示词对于AI是有效的?
刚上手那会,我倾向于将 prompt 翻译为“指令”,但这并不精确。“指令”通常对应instructions,属于 prompt 中的纯指令部分,通常是一个动宾结构(做什么)。剩下的部分更多是描述(describe…...
软件外包资源网站分享
经济不景气导致很多人失业,能否找到一份工作或找些项目做做,这里列了一些国内和国外的资源网上,希望对大家有益: 国内篇: 软件项目交易网:(软件项目交易网)这是一个专注于软件开发需求的外包平台…...
在控制理论里,单个输入变量被施加了饱和特性处理,那么后续怎么利用李雅普诺夫判据判断系统稳定性呢?
在控制理论中,当一个系统的输入变量被施加了饱和特性(即输入被限制在某个范围内),系统的稳定性分析可能变得更复杂。使用李雅普诺夫方法判断这样的系统稳定性通常需要考虑非线性特性。下面是如何使用李雅普诺夫方法进行稳定性分析…...

MySQL夯实之路-查询性能优化深入浅出
MySQL调优分析 explain;show status查看服务器状态信息 优化 减少子任务,减少子任务执行次数,减少子任务执行时间(优,少,快) 查询优化分析方法 1.访问了太多的行和列࿱…...
UniApp面试题
面试题1 问:什么是 UniApp?它有哪些特点? 答:UniApp 是一种基于 Vue.js 开发跨平台应用的框架。它可以同时构建运行在多个平台(包括但不限于小程序、H5、App)的应用程序。UniApp 的特点包括:一…...

30 树的定义
树的定义 树的度?叶节点? 注意:k为叶节点 孩子/双亲/子孙/祖先 树的高度? 有序树 森林 树的一些操作: 粗略的框架代码: 省略。。。 小结: 树是线性表的扩展...
程序员必备的面试技巧
程序员必备的面试技巧 “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀…...

【NI-DAQmx入门】LabVIEW中DAQmx同步
1.同步解释 1.1 同步基础概念 触发器:触发器是控制采集的命令。您可以使用触发器来启动、停止或暂停采集。触发信号可以源自软件或硬件源。 时钟:时钟是用于对数据采集计时的周期性数字信号。根据具体情况,您可以使用时钟信号直接控制数据采…...
FlinkRestAPI
which flink 找到Flink客户端地址 如果输出结果为空,则说明 Flink 客户端没有安装在系统路径中。在这种情况下,您可以通过设置 FLINK_HOME 环境变量来指定 Flink 客户端的路径。例如: export FLINK_HOME/opt/flink 然后,您可以使…...
Qt获取当前系统网络接口信息
1.QInterface获取网络接口信息 void NetProperty::init() {// 获取所有网络接口const QList<QNetworkInterface> interfaces QNetworkInterface::allInterfaces();ui->com_Interface->clear();for(const QNetworkInterface& interface : interfaces){ui->…...

【C++】STL 算法 ④ ( 函数对象与谓词 | 一元函数对象 | “ 谓词 “ 概念 | 一元谓词 | find_if 查找算法 | 一元谓词示例 )
文章目录 一、函数对象与谓词1、一元函数对象2、" 谓词 " 概念3、find_if 查找算法 二、一元谓词示例1、代码示例 - 一元谓词示例2、执行结果 一、函数对象与谓词 1、一元函数对象 " 函数对象 " 是通过 重载 函数调用操作符 () 实现的 operator() , 函数对…...
C++ 并发编程 | 并发世界
一、C 并发世界 1、什么是并发? 并发是指两个或更多独立的活动同时发生,计算机中的并发指的是,在单个系统里同时执行多个独立的活动...

GitHub注册新账号的操作流程(详细)
目录 第一步 进入官网,点击右上角的"Sign up" 第二步 输入email地址 第三步 设置密码 第四步 输入昵称 第五步 根据个人喜好决定要不要接收GitHub的邮件推送。然后回答他们的验证问题 第六步 输入验证码 我在注册github账号时遇到过一些阻碍&#x…...

Kali安装Xrdp结合内网穿透实现无公网ip远程访问系统桌面
文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于,它允许用户从远程位置访问Kali系统,而无需直接物理访…...

【WEB API自动化测试】接口文档与在线测试
这一篇我们主要介绍如何做API帮助文档,给API的调用人员介绍各个 API的功能, 输入参数,输出参数, 以及在线测试 API功能(这个也是方便我们自己开发调试) 我们先来看看我们的API最终帮助文档及在线测试最终达到的效果: 概要图 GET API 添加产品API: 删除…...

【深度学习每日小知识】Training Data 训练数据
训练数据是机器学习的基本组成部分,在模型的开发和性能中起着至关重要的作用。它是指用于训练机器学习算法的标记或注释数据集。以下是与训练数据相关的一些关键方面和注意事项。 Quantity 数量 训练数据的数量很重要,因为它会影响模型的泛化能力。通常…...

[acm算法学习] 后缀数组SA
学习自B站up主 kouylan 定义 后缀是包含最后个字母的子串 把字符串 str 的所有后缀按字典排序,sa[i]表示排名为 i 的后缀的开头下标 如何求解SA 倍增的方法 先把每个位置开始的长度为1的子串排序,在此基础上再把长度为2的子串排序(长度…...

DNS解析和它的三个实验
一、DNS介绍 DNS:domain name server 7层协议 名称解析协议 tcp /53 主从之间的同步 udp/53 名字解析 DNS作用:将域名转换成IP地址的协议 1.1DNS的两种实现方式 1.通过hosts文件(优先级最高) 分散的管理 linux /etc/hos…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...