Kubernetes增强型调度器Volcano算法分析【华为云技术分享】
【摘要】 Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的。Volcano 方便 AI、大数据、基因、渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异构芯片管理,高性能任务运行管理等能力。

1 为什么K8S需要Volcano
K8S自带的的资源调度器,有一个明显的特点是:依次调度每个容器。但在AI训练或者大数据,这种必须多个容器同时配合执行的情况下,容器依次调度是无法满足需要的。因为这些计算任务包含的容器们想要的是,要么同时都成功,要么就都别执行。
比如,某个大数据应用需要跑1个Driver容器+10个Executor容器(对应AI训练的话,就是1个PS容器+10个Worker容器)。如果容器是一个一个的调度,假设在启动最后一个executor容器(对应AI是Worker容器)时,由于资源不足而调度失败无法启动。那么前面的9个executor容器虽然运行着,其实也是浪费的。AI训练也是一样的道理,必须所有的Worker都同时运行,才能进行训练,坏一个,其他的容器就等于白跑。而GPU被容器霸占着却不能开始计算,成本是非常高的。
所以当你的(1)总体资源需求<集群资源的时候,普通的K8S自带调度器可以跑,没问题。但是当(2)总体资源需求>集群资源的时候,K8S自带调度器会因为随机依次调度容器,使得部分容器无法调度,从而导致业务占着资源又不能开始计算,死锁着浪费资源。那么场景(1)和场景(2)谁说常态呢?不用说,肯定是(2)了,谁能大方到一直让集群空着呢对吧。这个时候就必须需要增强型的K8s资源调度器Volcano了。
2 资源调度领域
当用户向K8s申请容器所需的计算资源(如 CPU、Memory、GPU等)时,调度器负责挑选出满足各项规格要求的节点来部署这些容器。通常,满足各项要求的节点并非唯一,且水位(节点已有负载)各不相同,不同的分配方式最终得到的分配率存在差异,因此,调度器的一项核心任务就是以最终资源利用率最优的目标从众多候选机器中挑出最合适的节点。
除了资源维度上的要求,实际调度中还有容灾和干扰隔离上的考虑:比如同一应用的容器不允许全部部署到同一台节点上,很多应用会要求每台节点上只允许有一个实例。另外,某些应用组件之间还存在互斥关系(如资源争抢),严重影响应用的性能,因此也不允许它们被部署到同一台节点上。这些限制条件的引入,使得想新写一款调度器,能替代原生K8S调度器并不容易。
3 算法分析
Volcano首先要解决的问题就是Gang Scheduling的问题,即一组容器要么都成功,要么都别调度。这个是最基本的用来解决资源死锁的问题,可以很好的提高集群资源利用率(在高业务负载时)。除此之外,它还提供了多种调度算法,例如priority优先级,DRF(dominant resource fairness), binpack等。 我们今天就是挖一挖Volcano内部的各种调度算法实现。
3.1 Gang Scheduling
这种调度算法,首先就是有’组’的概念,调度结果成功与否,只关注整一’组’容器。
具体算法是,先遍历各个容器组(代码里面称为Job),然后模拟调度这一组容器中的每个容器(代码里面称为Task)。最后判断这一组容器可调度容器数是否大于最小能接受底限,可以的话就真的往节点调度(代码里面称为Bind节点)。

3.2 DRF(dominant resource fairness)
这种调度算法,主要是Yarn和Mesos都有,而K8S没有,需要补齐。概括而言,DRF意为:“谁要的资源少,谁的优先级高”。因为这样可以满足更多的作业,不会因为一个胖业务,饿死大批小业务。注意:这个算法选的也是容器组(比如一次AI训练,或一次大数据计算)。

3.3 binpack
这种调度算法,目标很简单:尽量先把已有节点填满(尽量不往空白节点投)。具体实现上,binpack就是给各个可以投递的节点打分:“假如放在当前节点后,谁更满,谁的分数就高”。因为这样可以尽量将应用负载靠拢至部分节点,非常有利于K8S集群节点的自动扩缩容功能。注意:这个算法是针对单个容器的。

3.4 proportion(Queue队列)
Queue功能是Yarn调度器有的功能,K8S需要补齐。不过我对Queue这个取名有些不太满意。因为它实际上是用来控制集群总资源分配比例的。比如说某厂有2个团队,共享一个计算资源池。管理员设置:A团队最多使用总集群的60%。然后B团队最多使用总集群的40%。那投递的任务量,超过该团队的可用资源怎么办?那就排队等呗,所以特性取名Queue。

3.5 最终权重
由于Volcano的调度算法插件实在太多,每个插件的决策又有可能互相干扰。所以为了在各个算法间做权衡,又给插件设置了权重,这样可以控制每种调度算法插件的影响因子。比如NodeOrder算法里面,就是在优选阶段(注:k8s调度,分预选阶段和优选阶段。预选就是排除不符合的节点。优选就是给所有符合的节点打分)给节点打分的算法。各个算法有自己的权重可以配置。
4 Volcano
Volcano项目的前身是Kube-Batch,一个带着想解决k8s不支持Gang Scheduling问题初衷的项目。后来由于AI和大数据等业务领域也开始对K8s有述求情况下,团队成员希望有一种喷薄而出的感觉,所以带上具体场景实践经验,重新将项目命名为Volcano,火山。希望能够推动K8S在各个场景下向火山一样热烈绽放。
如果有兴趣共享一份力量,可以访问 https://volcano.sh/ 参与。
作者:tsjsdbd
Kubernetes增强型调度器Volcano算法分析【华为云技术分享】的更多相关文章
- Kubernetes增强型调度器Volcano算法分析
[摘要] Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的.Volcano 方便 AI.大数据.基因.渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异 ...
- 【华为云技术分享】跟唐老师学习云网络 : Kubernetes网络实现
当今K8s独霸天下之时,咱们站在更高的角度,好好的看看K8s网络是以什么理念构筑的.以及一个容器集群的好保姆,是如何分别照顾 南北流量和东西流量的. 一.简单介绍下Kubernetes 略..容器集群 ...
- MySQL 8.0新增特性详解【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 不服跑个分:ARM鲲鹏云服务器实战评测——华为云鲲鹏KC1实例 vs. 阿里云G5实例【华为云技术分享】
原文链接:https://m.ithome.com/html/444828.htm 今年一月份,华为正式发布了鲲鹏920数据中心高性能处理器,该处理器兼容ARM架构,采用7纳米制造,最高支持64核,主 ...
- 【我的物联网成长记6】由浅入深了解NB-IoT【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 挑战10个最难的Java面试题(附答案)【上】【华为云技术分享】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/devcloud/article/deta ...
- 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】
集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略.其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型.集成学习简单的示例图如下: 通过训练得到 ...
- 【华为云实战开发】10.经典的C++项目怎么在云端开发?【华为云技术分享】
1 概述 1.1 文章目的 本文主要想为研发C++项目的企业或个人提供上云指导,通过本文中的示例项目 “音频解析器”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测试管理的操作指导,覆盖软 ...
随机推荐
- maven 学习---Maven构建生命周期
构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典型的 Maven 构建生命周期是由以下几个阶段的序 ...
- 程序员必备技能之Markdown
Markdown介绍 Markdown是一种纯文本格式的标记语言,比HTML更简单,通过一些简单的语法标记,就可以让文本简洁好看. Markdown已经是程序员一项必备技能了,代码块.流程图.序列图. ...
- hashlib(hmac)进阶之client跟server交互
首先我还是要强调不管任何相同的字符串通过hashlib加密之后都会产生相同的32位字符串,这个是日常Web中常用的加密算法如果我的client发送一个请求过来我server接受到后就要对该密码进行判断 ...
- liteos时间管理(九)
1. 时间管理 1.1 概述 1.1.1 概念 时间管理以系统时钟为基础.时间管理提供给应用程序所有和时间有关的服务. 系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数. ...
- linux的initcall机制
linux的initcall机制(针对编译进内核的驱动) initcall机制的由来 我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者 ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第十四周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第十四周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...
- 201871010134-周英杰《面向对象程序设计(java)》第八周学习总结
201871010134-周英杰<面向对象程序设计(java)>八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个 ...
- zzDeep Learning Papers Translation(CV)
Deep Learning Papers Translation(CV) Image Classification AlexNetImageNet Classification with Deep C ...
- leetcode2. 两数相加
使用迭代的方式 class Solution{ public: ListNode *addTwoNumbers(ListNode* l1,ListNode *l2) { ListNode *res=) ...
- python的可变类型和不可变类型
Python有六种数据类型:数字类型.字符串类型.列表类型.元组类型.字典类型和集合类型 其中不可变类型包括三种:数字类型.字符串类型和元组类型 剩余三种为可变类型:列表类型.字典类型和集合类型 可变 ...