GTLC全球技术领导力峰会·上海站,首批讲师正式上线! 了解详情
写点什么

Kubernetes 增强型调度器 Volcano 算法分析

2019 年 10 月 28 日

Kubernetes增强型调度器Volcano算法分析

K8s 自带资源调度器有一个明显的特点是:依次调度每个容器。但在 AI 训练或者大数据,这种必须多个容器同时配合执行的情况下,容器依次调度是无法满足需要的。因为这些计算任务包含的容器想要的是,要么同时都成功,要么就都别执行。



比如,某个大数据应用需要跑 1 个 Driver 容器+10 个 Executor 容器(对应 AI 训练的话,就是 1 个 PS 容器+10 个 Worker 容器)。如果容器是一个一个的调度,假设在启动最后一个 executor 容器(对应 AI 是 Worker 容器)时,由于资源不足而调度失败无法启动。那么前面的 9 个 executor 容器虽然运行着,其实也是浪费的。AI 训练也是一样的道理,必须所有的 Worker 都同时运行,才能进行训练,一个坏了,其他容器都等于白跑,而 GPU 被容器霸占着却不能开始计算,成本是非常高的。


所以当总体资源需求小于集群资源时,普通的 K8s 自带调度器可以跑,没问题。但是当总体资源需求大于集群资源的时候,K8s 自带调度器会因为随机依次调度容器,使得部分容器无法调度,从而导致业务占着资源又不能开始计算,死锁着浪费资源。那么,上述两个场景哪一个更加常态呢?不用说,肯定是第二个,很少有企业可以大方到一直让集群空着,此时就需要增强型的 K8s 资源调度器 Volcano 了。


资源调度领域

当用户向 K8s 申请容器所需的计算资源(如 CPU、Memory、GPU 等)时,调度器负责挑选出满足各项规格要求的节点来部署这些容器。通常,满足各项要求的节点并非唯一,且水位(节点已有负载)各不相同,不同的分配方式最终得到的分配率存在差异。因此,调度器的一项核心任务就是以最终资源利用率最优的目标从众多候选机器中挑出最合适的节点。


除了资源维度上的要求,实际调度中还有容灾和干扰隔离上的考虑:比如同一应用的容器不允许全部部署到同一台节点上,很多应用会要求每台节点上只允许有一个实例。另外,某些应用组件之间还存在互斥关系(如资源争抢),严重影响应用的性能,因此也不允许它们被部署到同一台节点上。这些限制条件的引入,使得想新写一款调度器,能替代原生 K8S 调度器并不容易。


算法分析

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 调度,分预选阶段和优选阶段。预选就是排除不符合的节点。优选就是给所有符合的节点打分)给节点打分的算法。各个算法有自己的权重可以配置。


Volcano

Volcano 项目的前身是 Kube-Batch,一个带着想解决 k8s 不支持 Gang Scheduling 问题初衷的项目。后来由于 AI 和大数据等业务领域也开始对 K8s 有述求情况下,团队成员希望有一种喷薄而出的感觉,所以带上具体场景实践经验,重新将项目命名为 Volcano,火山。希望能够推动 K8S 在各个场景下向火山一样热烈绽放,目前 Volcano 项目已服务于华为云基因容器、大数据容器和 AI 容器。


如果有兴趣共享一份力量,可以访问 https://volcano.sh/ 参与。


2019 年 10 月 28 日 08:362204

评论

发布
暂无评论
发现更多内容

云算力挖矿模式系统开发,云算力平台搭建

13530558032

Alibaba首发的《Java技术成长笔记》,渴望提升自己的程序员的必备宝典!

Java架构之路

Java 程序员 架构 面试 编程语言

两句话给面试官讲清楚IOC

执墨

spring ioc 依赖倒置原则 springioc 控制反转

代码写的烂才是原罪?字节三面+微信四面+PayPal四面,大厂面经分享

Crud的程序员

架构 面试 数据 字节

USDT币支付系统开发搭建,区块链承兑商支付平台

13530558032

架构师第一期作业(第 9 周)

Cheer

作业

程序员求助:腾讯面试题,64匹马8个跑道,多少轮选出最快的四匹

Java架构师迁哥

《精通lambda表达式:Java多核编程》.pdf

田维常

Lambda

adb的常用操作命令

Yolanda_trying

程序员双十一剁手指南

数据君

腾讯云 程序员

企业工作流设计原则及注意事项

力软.net/java开发平台

工作流

亿级大表分库分表实战总结(万字干货,实战复盘)

云流

学习 编程 架构 计算机网络

数字货币钱包开发费用,区块链钱包开发优势

13530558032

覆盖全网的阿里微服务架构有多牛:K8S+实战+笔记+项目教程

Java~~~

Java 程序员 微服务 Spring Cloud 阿里云 K8S

“3+3”看华为云FusionInsight如何引领“数据新基建”持续发展

华为云开发者社区

数据库 新基建 华为云

这套JVM核心知识你要全都会,月薪还不过18K可以直接跳槽了

小Q

Java 学习 架构 面试 JVM

干货!直观地解释和可视化每个复杂的DataFrame操作

计算机与AI

Python pandas 数据处理

SQL数据库:CASE表达式

正向成长

CASE表达式

数字货币交易所功能,场外OTC交易所开发公司

13530558032

断供,危机or契机?开源商业化or社区化?后疫情下的开源路这样走 | 大咖对话

易观大数据

超越竞争文化:致善式创新能否打造手机产业的“海法城”

脑极体

不要拿区块链做挡箭牌

CECBC区块链专委会

区块链

数字货币助力支付体系高效运行

CECBC区块链专委会

金融

揭秘双11:前端技术体系

阿里云情报局

前端 前端进阶

即将写入MySQL源码的官方bug解决之路

数据君

MySQL

花四个月和阿里面试官“大战”7回合,成功将其“斩于马下”!复盘面试题及答案!

Java架构追梦

Java 阿里巴巴 面试题 面试经历 java架构

限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

周老师

Java 微服务 算法 并发 QPS

报告显示国际区块链监管呈三大趋势

CECBC区块链专委会

区块链 货币 监管

「Spring Boot 2.4 新特性」一键构建Docker镜像

AI乔治

Java Docker 架构

那个小白还没搞懂内存溢出,只能用案例说给他听了

田维常

内存溢出

牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。

Java架构之路

Java 程序员 架构 面试 编程语言

DNSPod与开源应用专场

DNSPod与开源应用专场

Kubernetes增强型调度器Volcano算法分析-InfoQ