kube-scheduler 调度调优
文章转载自:https://www.kuboard.cn/learning/k8s-advanced/schedule/tuning.html
kube-scheduler 是 Kubernetes 中的默认调度器。负责为 Pod 在集群中选择合适的节点。
集群中能够满足某一个 Pod 的资源需求的节点,我们称其为 可选节点(feasible node)。调度器在执行调度时,执行的步骤如下:
1.找出该 Pod 的所有 可选节点
2.按照某种方式对每一个 可选节点 评分
3.选择评分最高的 可选节点
4.将最终选择结果通知 API Server,这个过程,我们称其为绑定(binding)
本文解释了在规模较大的 Kubernetes 集群中如何对 kube-scheduler 进行性能调优。
参与评分的节点的比例
在 Kubernetes v1.12 版本之前,kube-scheduler 检查集群中的所有节点是否对 Pod 可选,并对 可选节点 进行评分。在 Kubernetes v1.12 中,添加了一个新的特性,使得 kube-scheduler 在找到了一定数量的 可选节点 后,便停止继续寻找更多 可选节点。 这个特性可以显著提高 kube-scheduler 在大规模 Kubernetes 集群中的性能。通过 percentageOfNodesToScore 这个配置参数,我们可以控制 kube-scheduler 在找到多少 可用节点 之后变停止继续寻找。该参数的可选值为 1 - 100 之间的数字,大于 100 的将被认为是 100%,0 代表忽略该配置。
在 Kubernetes v1.14 中,如果不定义 percentageOfNodesToScore,kube-scheduler 将按照一个线性公式来确定该参数的取值。按照该公式:
- 100节点集群,percentageOfNodesToScore 为 50%
- 5000节点集群,percentageOfNodesToScore 为 10%
- percentageOfNodesToScore 的最小值为 5%;(即,不论集群规模有多大,按照该公式,percentageOfNodesToScore 最终取值为 5%,除非集群管理员将该参数配置为小于 5% 的值)
下面的例子中,将 percentageOfNodesToScore 配置为 50%
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
provider: DefaultProvider
...
percentageOfNodesToScore: 50
例外:当集群中可选节点数量少于 50 时,调度器仍将继续检查剩余的节点。
如果要禁用该特性,可将 percentageOfNodesToScore 设定为 100。
调优 percentageOfNodesToScore
percentageOfNodesToScore 的取值在 1 到 100 之间,默认值基于集群节点的数量计算得出。并且,将至少要找出 50 个可选节点,否则仍会检查集群中所有节点是否对 Pod 可用。这就意味着,当集群的节点数不超过 1000 时,修改该参数并不会对实际结果产生多大的影响。Kubernetes 有意做了此设计,因为在小规模集群中,kube-scheduler 的性能差异不大。当集群节点数超过 1000 时,调整此参数将有可能显著提升 kube-scheduler 的性能。
关于 percentageOfNodesToScore,一个重要的考虑因素是,如果只检查了集群中一小部分节点对 Pod 是否可选,也就意味着更多的节点未能参与该 Pod 的评分。此时存在的可能性是,未参与评分的节点数量可能实际得分会比最终选中的节点得分更高,即,Pod 并没有找到集群中“最”适合其运行的节点。因此,percentageOfNodesToScore 不应该设置为一个过低的数值。通常,不要将其设置为低于 10 的数字。在如下情况都满足时,可以考虑更低的数字:
- kube-scheduler 的吞吐量(每秒钟执行调度的次数)非常重要
- 节点的评分是否为最高,没那么重要
当集群节点数量不超过 1000甚至更少时,不推荐修改该参数的默认取值,此时调整此参数对 kube-scheduler 性能的影响不大。
调度器遍历节点的方法
为了让集群中的每个节点都有公平的机会被 Pod 选中,调度器按照 round-robin(轮询)的方式遍历节点。您可以认为,节点被放在一个数组中,调度器从数组的第一个元素开始检查节点是否为 可选节点,直到其找到足够多数量(由percentageOfNodesToScore指定)的 可选节点。当调度器调度下一个 Pod 时,将继续从上一次停止的地方往后面便利节点的数组,到达数组的末尾时,又从数组的第一个元素继续遍历。
如果节点在多个高可用区,调度器将遍历多个高可用区终端额节点,以确保不同的可用区都有合适的机会。例如,假设 6 个节点分布于两个可用区:
Zone 1: Node 1, Node 2, Node 3, Node 4
Zone 2: Node 5, Node 6
调度器将按照下面的顺序评估节点是否为可选节点:
Node 1, Node 5, Node 2, Node 6, Node 3, Node 4
到达结尾 Node 4 后,又从 Node 1 继续遍历。
kube-scheduler 调度调优的更多相关文章
- Cloudera Hadoop 5& Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)
1.课程环境 本课程涉及的技术产品及相关版本: 技术 版本 Linux CentOS 6.5 Java 1.7 Hadoop2.0 2.6.0 Hadoop1.0 1.2.1 Zookeeper 3. ...
- mapreduce的调度算法和job调优
调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...
- Golang 的 协程调度机制 与 GOMAXPROCS 性能调优
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- (转)SQL Server 性能调优(cpu)
摘自:http://www.cnblogs.com/Amaranthus/archive/2012/03/07/2383551.html 研究cpu压力工具 perfom SQL跟踪 性能视图 cpu ...
- MySQL 调优基础(四) Linux 磁盘IO
1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...
- Linux优化之IO子系统监控与调优
Linux优化之IO子系统 作为服务器主机来讲,最大的两个IO类型 : 1.磁盘IO 2.网络IO 这是我们调整最多的两个部分所在 磁盘IO是如何实现的 在内存调优中,一直在讲到为了加速性能,linu ...
- Nginx下载服务生产服务器调优
一.内存调优 内核关于内存的选项都在/proc/sys/vm目录下. 1.pdflush,用于回写内存中的脏数据到硬盘.可以通过 /proc/sys/vm/vm.dirty_background_ ...
- 基于CDH 5.9.1 搭建 Hive on Spark 及相关配置和调优
Hive默认使用的计算框架是MapReduce,在我们使用Hive的时候通过写SQL语句,Hive会自动将SQL语句转化成MapReduce作业去执行,但是MapReduce的执行速度远差与Spark ...
- Apache Spark Jobs 性能调优
当你开始编写 Apache Spark 代码或者浏览公开的 API 的时候,你会遇到各种各样术语,比如transformation,action,RDD(resilient distributed d ...
随机推荐
- springboot动态读取properties 和yml的配置
properties使用PropertiesLoaderUtils,yml使用YamlPropertySourceLoader application.properties microsoft.def ...
- 数据类型 简单扩展(Java)
public class HelloWorld { public static void main(String[] args) { //整数拓展 进制 二进制0b 十进制 八进制0 十六进制0x i ...
- Code Runner for VS Code,下载量突破 4000 万!支持超过50种语言
大家好! 我是韩老师.还记得 6 年前的夏天,我在巨硬写着世界上最好的语言,有时也需要带着游标卡尺写着另一门语言.然而,我对这两门语言都不熟悉,如果能在 VS Code 中方便快捷地运行各种语言,那岂 ...
- Spring Data JPA 在 @Query 中使用投影的方法
Spring Data JPA 在 @Query 中使用投影的方法 关于投影的基本使用可以参考这篇文章:https://www.baeldung.com/spring-data-jpa-project ...
- Solution -「ABC 217」题解
D - Cutting Woods 记录每一个切割点,每次求前驱后驱就好了,注意简单判断一下开闭区间. 考场上采用的 FHQ_Treap 无脑莽. #include <cstdio> #i ...
- Scala的基础用法 和 Java相对应学习(二)变量、循环、语法
一.配置相关环境 1.增加项目 在idea里面创建新的maven项目 2. 在pom文件中增加依赖 <?xml version="1.0" encoding="UT ...
- .net 温故知新:【6】Linq是什么
1.什么是Linq 关于什么是Linq 我们先看看这段代码. List<int> list = new List<int> { 1, 1, 2, 2, 3, 3, 3, 5, ...
- C++ 实现可变参数的三个方法
有时我们无法提前预知应该向函数传递几个实参.例如,我们想要编写代码输出程序产生的错误信息,此时最好用同一个函数实现该项功能,以便对所有错误的处理能够整齐划一.然而,错误信息的种类不同,所以调用错误输出 ...
- 《Python编程:从入门到实践》第19章笔记:用户/用户注册/身份验证
接上篇django最基本的一些日常用法,这是第19章笔记,希望在做"动手试一试"的时候可以让自己方便参考. 这一章实现了两个功能: 1.让用户能够添加主题Topic和条目Entry ...
- js入门基础
JavaScript语言介绍 JavaScript的历史 诞生于1995年,最初名字叫做Mocha,1995年9月改为LiveScript.Netscape公司与Sun公司(Java语言的发明者)达成 ...