K8s scheduler 调度:预选和优选策略

news2024/12/27 12:40:26

3b2bdf106f525de047628a76960986e6.gif

1

环境准备

kube-scheduler是k8s的核心组件之一,主要负责Pod的调度。scheduler通过监听kube-apiserver,查询未分配 Node的Pod,根据配置的调度策略,将Pod调度到最优的工作节点上,从而高效、合理地利用k8s集群资源。

在master节点通过ps命令可以查看scheduler的启动参数

root       2035   1930  0 10:17 ?        00:00:11 kube-scheduler --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/etc/kubernetes/scheduler.conf --bind-address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true

可以为scheduler设置额外配置策略文件,例如

-–policy-config-file=/etc/kubernetes/scheduler-policy.config

如果没有配置则使用的是默认调度算法,默认调度算法分为预选和优选两个阶段:

  • 预选调度:遍历所有目标 Node, 筛选出符合要求的节点。

  • 优选调度:确定最优节点,在第一步的基础上,采用优选策略计算出每个候选节点的积分。评分时会根据评分算法为通过预选的节点进行打分,选择得分最高的节点。例如,资源越充足、负载越小的节点可能具有越高的排名。

2

预选策略


Scheduler默认加载的预选策略有5个,PodFitsPorts、PodFitsResources、PodSelectorMatches(MatchNodeSelector)、PodFitHost(HostName)、NoDiskConflict。


  1. PodFitsPorts:判断 Pod 所用的端口,在备选节点中是否被占用。如果占用返回false ,否则返回true。

  2. PodFitsResources:判断备选节点资源是否满足 Pod 需求。计算备选 Pod 和节点中已存在的 Pod 的所有容器的资源需求(cpu 内存)的总和,获得备选节点的节点资源信息。判定资源不满足则返回false, 如果满足返回true。

  3. PodSelectorMatches:判断备选节点是否包含备选 Pod 的标签选择器指定的标签。如果pod 没有指定 spec.nodeSelector ,则返回true。如果pod 有指定 spec.nodeSelector, 则判断节点是否包含 pod 指定的标签, 如果有就返回true 否则返回 false。

  4. PodFitHost:判断备选 Pod 的 spec.nodeName 所指定的节点名称和备选节点的名称是否一致,一致返回true 否则返回 false。

  5. NoDiskConflict:判断备选 pod 的GcePersistentDisk 或 AwsElasticBlockStore 和备选的节点中已存在的pod 是否存在冲突。读取备选pod的所有volume值(pod.spec.volumes), 对每个Volume执行以下冲突检测,将Volume 和备选节点上的所有 Pod 的每个Volume 进行比较, 如果发现相同的GcePersistentDisk或AwsElasticBlockStore, 则返回false,如果均未发现冲突,返回true。


还可以指定使用 CheckNodeLabelPresence、CheckServiceAffinity等预选策略。


3

优选策略


经过预选策略筛选后得到的Nodes,会来到优选步骤。在这个过程中,会并发的根据每个Priorities Policy分别启动一个goroutine,在每个goroutine中会根据对应的policy实现,遍历所有的预选Nodes,分别进行打分,每个Node每一个Policy的打分为0-10分,0分最低,10分最高。待所有policy对应的goroutine都完成后,根据设置的各个priorities policies的权重weight,对每个node的各个policy的得分进行加权求和作为最终的node的得分。

  1. leastRequestedPriority:计算Pods需要的CPU和内存在当前节点可用资源的百分比,具有最小百分比的节点就是最优,得分计算公式 (cpu(capacity-sum(requested))*10/capacity)+(memory(capacity-sum(requested))*10/capacity)/2

  2. CalculateNodeLabelPriority:判断策略列出的标签在备选节点中存在时,是否选择该节点,如果备选节点上标签在优选策略标签列表中存在,且Presence 为true, 或者备选节点上标签不再优选策略标签列表中且Presence为false, 则备选节点score=10 否则 score=0。

  3. BalanceResourceAllocation:选出资源使用率最均匀的节点,计算备选节点上pod+待分配pod 所占资源(CPU, MEMORY)的总量,计算得分,公式为score=int(10-math.Abs(totalMilliCPU/nodeCpuCapacity-totalMemory/nodeMemoryCapacity)*10)

  4. TaintToleration:将Pod对象的spec.tolerations与节点的taints列表项进行匹配度检查,匹配的条目越多得分越低。

  5. ImageLocalityPriority:根据Node上是否存在一个pod的容器运行所需镜像大小对优先级打分,分值为0-10。遍历全部Node,如果某个Node上pod容器所需的镜像一个都不存在,分值为0;如果Node上存在Pod容器部分所需镜像,则根据这些镜像的大小来决定分值,镜像越大,分值就越高;如果Node上存在pod所需全部镜像,分值为10。

  6. NodePreferAvoidPodsPriority(权重1W):如果节点的 Anotation 没有设置 scheduler.alpha.kubernetes.io/preferAvoidPods,则节点对该 pod 的得分就是10分,加上权重10000,那么该node对该policy的得分至少10W分。设置该anotation的 node 对该 policy 的得分就是0分。

  7. InterPodAffinityPriority:基于亲和性(affinity)和反亲和性(anti-affinity)计算分数。

  8. NodeAffinityPriority:基于节点亲和性计算分数。

4

尾巴

有些k8s集群会配置自定义调度器,以实现默认调度器无法实现的调度能力。如果集群中有自定义调度器和默认调度器,可以通过查看具体pod的yaml文件,查看这个pod使用哪个调度器进行调度。default-scheduler就是使用k8s默认调度器。

8bb63f10709b32f4617fd8c351f1aec1.png

其实大部分情况使用k8s默认调度器已经足够了,上述预选优选策略中有多种可配置的调度策略,例如nodeSelector、nodeAffinity、podAffinity、podAntiAffinity、taint污点、Topology拓扑分布等等,后续文章会一一讲解,欢迎关注~

点个赞

b979b5010a618dfea3be393ae157fba4.gif

再走吧

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

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

相关文章

shell之数组

一. 关于数组的命令 1. 定义数组 数组名(value0 value1 value2 …) arr(元素1 元素2 元素3 ...) echo ${arr[]}数组名([0]value [1]value [2]value…" arr ([下标1]值1 [下标2]值2 ....) echo ${array3[]}列表名"value0 value1 value2 list"值1 值2 值3 ..…

一文解读spring中事务管理

目录 声明式事务概念 事务基本概念 ①什么是事务 ②事务的特性 编程式事务 声明式事务 基于注解的声明式事务 准备工作 测试无事务情况 加入事务 Transactional的使用 事务属性:只读 事务属性:超时 事务属性:回滚策略 事务属性…

华为OD机试真题 Java 实现【寻找链表的中间结点】【2023Q1 100分】

一、题目描述 给定一个单链表 L,请编写程序输出 L中间结点保存的数据。如果有两个中间结点,则输出第二个中间结点保存的数据。 例如: 给定 L 为 1 -> 7 -> 5,则输出应该为 7; 给定 L 为 1 -> 2 -> 3 -> 4&#…

微服务简介,SpringCloud Alibaba Nacos的安装部署与使用,Nacos集成springboot实现服务注册

目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用安装部署服务注册 &am…

聊一聊适配器模式

接口不能用?行,我帮你适配 一、概述 适配器模式(Adapter),是23种设计模式中的结构型模式之一;它就像我们电脑上接口不够时,需要用到的拓展坞,起到转接的作用。它可以将新的功能和原…

SCS【26】单细胞细胞间通信第二部分通信网络的系统分析(CellChat)

桓峰基因公众号推出单细胞生信分析教程并配有视频在线教程,目前整理出来的相关教程目录如下: Topic 6. 克隆进化之 Canopy Topic 7. 克隆进化之 Cardelino Topic 8. 克隆进化之 RobustClone SCS【1】今天开启单细胞之旅,述说单细胞测序的前世…

《微服务实战》 第十一章 Spring Cloud Alibaba nacos配置中心

前言 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。 Spring Cloud Aliba…

【C++ 入坑指南】(08)循环

文章目录 一、while 循环二、do...while 循环三、for 循环四、嵌套循环五、跳转语句5.1 break 语句5.2 continue 语句5.3 goto 语句 有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行&#xff0c…

c++ 11标准模板(STL) std::set(五)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

Java中的线程通信的几种方式

Java中的线程间通信是指不同线程之间相互协作&#xff0c;以完成一些复杂的任务或实现某些功能的过程。线程间通信主要包括两个方面&#xff1a;线程之间的互斥和同步&#xff0c;以及线程之间的数据共享和通信。Java提供了多种方式来实现线程间通信&#xff0c;本文将介绍Java…

Java | 一分钟掌握定时任务 | 5 - Spring Task

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱原创&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 多线程解决了并发阻塞问题&#xff0c;但是不能方便的表达我们的定时方…

redi可持久化配置

回顾&#xff1a;rpcbind111 nfs2049 redis高可用高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%&#xff0c;99.99%&#xff0c;99.999%等&#xff09; 还要考虑提供主从分离&#xff0c;快速容灾技术&#…

用netty实现聊天

1.引入netty依赖 <dependencies> <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.92.Final</version> </dependency> </dependencies> 2.准备一个服务端ChatServer和…

Redis优化与常见问题

---------------------- Redis 命令工具 ---------------------------------------- redis-server&#xff1a;用于启动 Redis 的工具 redis-benchmark&#xff1a;用于检测 Redis 在本机的运行效率 redis-check-aof&#xff1a;修复 AOF 持久化文件 redis-check-rdb&#xff1…

C语言库函数详解(两万字)

目录 目录 目录 前言 1.C 标准库 - <stdio.h> 简介 1.1 printf&#xff08;&#xff09;&#xff1b; 1.2 scanf(); 1.3 getchar(); 1.4 putchar(); 1.5 gets(); 1.6 puts(); 1.7fscanf(); 1.8 fprintf(); 1.9 fgetc(); 1.10 fgets(); 1.11 fputs(); 1.12 fclose();…

人机融合智能中的诱导引导交互

智能的核心不在于人工智能系统的记忆、注意力和上下文感知等能力&#xff0c;而在于其能够洞察、理解和解决问题的能力。也就是说智能系统需要具备更高层次的思维能力&#xff0c;能够从信息中抽象出本质&#xff0c;识别问题的核心&#xff0c;并提供有效的解决方案。这对于人…

MATLAB绘制动画(四)AVI

MATLAB绘制动画&#xff08;四&#xff09;AVI与GIF clc; clear; close all; fig figure ; aviobj avifile(example.avi); n 100; t 0:2*pi/n:2*pi; x cos(t); y sin(t); for k 1:nx(k) cos(t(k));y(k) sin(t(k));H plot(x,y,x(k),y(k),or,x(k),-y(k),ob);axis equa…

应届生怎么才能提高职场竞争力

前言 随着社会的不断发展&#xff0c;竞争也在逐渐增加。对于应届生来说&#xff0c;提高职场竞争力是很重要的&#xff0c;这样才能更好地融入工作环境、获得更好的机会和待遇。那么&#xff0c;应届生怎么才能提高职场竞争力呢&#xff1f;本文就来简单聊一聊。 应届生步入职…

【再获殊荣】中创算力入选“河南省2023年第五批拟入库科技型中小企业名单”

科技促发展&#xff0c;创新赢未来&#xff01; 科技型中小企业作为最具活力、最具潜力、最具成长性的创新群体&#xff0c;已成为我国在经济转型阶段培育发展新动能的重要载体&#xff01; 2022年&#xff0c;中创算力正式入库河南省2022年科技型中小企业。 2023年&#xf…

F. Array Stabilization (GCD version)

题目链接&#xff1a;传送门 思路&#xff1a; 进行预处理的算法模板&#xff1a; for(int i1;(1<<i)<n;i)for(int j1;j(1<<i)-1<n;j)st[j][i]gcd(st[j][i-1],st[j(1<<(i-1))][i-1]);进行查询的算法模板 int check(int i,int mid){int klog2(mid-i1);…