摘要:Volcano主要是基于Kubernetes做的一个批处理系统,希望上层的HPC、中间层大数据的应用以及最下面一层AI能够在统一Kubernetes上面运行的更高效。

Volcano产生的背景

上图是我们做的一个分析,我们将其分为三层,最下面为资源管理层,中间为领域的框架,包括AI的体系、HPC、Batch, WKflow的管理以及像现在的一些微服务及流量治理等。再往上是行业以及一些行业的应用。

随着一些行业的应用变得复杂,它对所需求的解决方案也越来越高。举个例子在10多年以前,在金融行业提供解决方案时,它的架构是非常简单的,可能需要一个数据库,一个ERP的中间件,就可以解决银行大部分的业务。

而现在,每天要收集大量的数据,它需要spark去做数据分析,甚至需要一些数据湖的产品去建立数据仓库,然后去做分析,产生报表。同时它还会用 AI的一些系统,来简化业务流程等。

因此,现在的一些行业应用与10年前比,变得很复杂,它可能会应用到下面这些领域框架里面的一个或多个。其实对于行业应用,它的需求是在多个领域框架作为一个融合,领域框架的诉求是下面的资源管理层能够提供统一的资源管理。

Kubernetes现在越来越多的承载了统一的资源管理的角色,它可以为 HPC这些行业领域框架提供服务,也可以作为大数据领域的资源管理层。Volcano主要是基于Kubernetes做的一个批处理系统,希望上层的HPC、中间层大数据的应用以及最下面一层AI能够在统一Kubernetes上面运行的更高效。

Volcano要解决什么样的问题?

挑战 1: 面向高性能负载的调度策略

    e.g. fair-share, gang-scheduling

挑战 2: 支持多种作业生命周期管理

    e.g. multiple pod template, error handling

挑战 3: 支持多种异构硬件

    e.g. GPU, FPGA

挑战 4: 面向高性能负载的性能优化

    e.g. scalability, throughput, network, runtime

挑战 5:支持资源管理及分时共享

    e.g. Queue, Reclaim

Volcano架构体系

蓝色部分是 K8s本身的组件,绿色的部分是Volcano新加的一些组件。

作业提交流程:

1、通过 Admission 后,kubectl 将在 kube-apiserver中创建 Job (Volcano CRD) 对像

2、JobController 根据 Job 的配置创建 相应的 Pods e.g. replicas

3、Pod及PodGroup创建 后,vc-scheduler 会到 kube-apiserver 获取Pod/PodGroup 以及 node 信息

4、获取信息后,vc-scheduler 将根据其配置的调度策略为每一个 Pod 选取合适节点

5、在为Pod分配节点后,kubelet 将从kube-apiserver中取得Pod的配置,启动相应的容器

需要强调的几点:

vc-scheduler 中的调度策略都以插件的形式存在, e.g. DRF, Priority, Gang

vc-controllers 包含了 QueueController, JobController,PodGroupController 以及 gc-controller

vc-scheduler 不仅可以调度批量计算的作业,也可以调度微服务作业;并且可以通过 multi-scheduler 功能与 kube-scheduler 共存

部分组件介绍

Controller

左边为Volcano Job Controller,不只调度使用的Volcano,Job的生命周期管理、作业管理都在这里面包含。我们提供了统一的作业管理,你只要使用Volcano,也不需要创建各种各样的操作,就可以直接运行作业。

右边为CRD Job Controller,通过下面的PodGroup去做集成。

scheduler架构体系

Scheduler支持动态配置和加载。左边为apiserver,右边为整个Scheduler,apiserver里有Job、Pod、Pod Group;Scheduler分为三部分,第一层为Cache,中间层为整个调度的过程,右边是以插件形式存在的调度算法。Cache会将apiserver里创建的Pod、Pod Group这些信息存储并加工为Jobinfors。中间层的OpenSession会从Cache里拉取Pod、Pod Group,同时将右边的算法插件一起获取,从而运行它的调度工作。

状态之间根据不同的操作进行转换,见下图。

另外,我们在Pod和Pod的状态方面增加了很多状态,图中蓝色部分为K8s自带的状态;绿色部分是session级别的状态,一个调度周期,我们会创建一个session,它只在调度周期内发挥作用,一旦过了调度周期,这几个状态它是失效的;黄色部分的状态是放在Cache内的。我们加这些状态的目的是减少调度和API之间的一个交互,从而来优化调度性能。

Pod的这些状态为调度器提供了更多优化的可能。例如,当进行Pod驱逐时,驱逐在Binding和Bound状态的Pod要比较驱逐Running状态的Pod的代价要小 (思考:还有其它状态的Pod可以驱逐吗?);并且状态都是记录在Volcano调度内部,减少了与kube-apiserver的通信。但目前Volcano调度器仅使用了状态的部分功能,比如现在的preemption/reclaim仅会驱逐Running状态下的Pod;这主要是由于分布式系统中很难做到完全的状态同步,在驱逐Binding和Bound状态的Pod会有很多的状态竞争。

在功能上面能带来哪些好处?

  1. 支持多种类型作业混合部署
  2. 支持多队列用于多租户资源共享,资源规划;并分时复用资源
  3. 支持多种高级调度策略,有效提升整集群资源利用率
  4. 支持资源实时监控,用于高精度资源调度,例如 热点,网络带宽;容器引擎,网络性能优化, e.g. 免加载

分布式训练场景:

Gang-scheduler

Case 1: 1 job with 2ps + 4workers

Case 2: 2 jobs with 2ps + 4workers

Case 3: 5 jobs with 2ps + 4workers

在Volcano和 kubeflow+kube-scheduler做对比,Case 1在资源充足的时候效果是差不多的;Case 2是在没有足够的资源的情况下同时运行两个作业,如果没有 gang-scheduling,其中的一个作业会出现忙等 ;Case 3当作业数涨到5后,很大概率出现死锁;一般只能完成2个作业。

IOAware

3个作业的执行时间总和; 每个作业带2ps + 4workers

默认调度器执行时间波动较大

执行时间的提高量依据数据在作业中的比例而定

减少 Pod Affinity/Anti-Affinity,提高调度器的整体性能

大数据场景

Spark-sql-perf (TP-DCS, master)

104 queries concurrently

(8cpu, 64G, 1600SSD) * 4nodes

Kubernetes 1.13

Driver: 1cpu,4G; Executor: (1cpu,4G)*5

如果没有固定的driver节点,最多同时运行 26 条查询语句

由于Volcano提供了作业级的资源预留,总体性能提高了~30%

HPC场景

MPI on Volcano

规划

GPU共享特性

1)算力优化:

  • GPU硬件加速,TensorCore
  • GPU共享
  • 昇腾改造

2)调度算法优化:

Job/Task模型,提供AI类Job统一批量调度

多任务排队,支持多租户/部门共享集群

单Job内多任务集群中最优化亲和性调度、Gang Scheduling等

主流的PS-Worker、Ring AllReduce等分布式训练模型

3)流程优化

  • 容器镜像
  • CICD流程
  • 日志监控

Volcano可以支持更大规模的一个集群调度,我们现在是1万个节点百万容器,调度的性能每秒达到2000个Pod。

1)编排:

Etcd 分库分表,e.g. Event 放到单独库,wal/snapshot 单独挂盘

通过一致性哈希分散处理,实现 controller-manager 多活

Kube-apiserver 基于工作负载的弹性扩容

2)调度:

通过 EquivalenceCache,算法剪枝 等技术提升单调度器的吞吐性能

通过共享资源视图实现调度器多活,提升调度速率

3)网络:

通过trunkport提升单节点容器密度及单集群ENI容量

通过 Warm Pool 预申请网口,提升网口发放速度

基于eBPF/XDP 支持大规模、高度变化的云原生应用网络,e.g. Service, network policy

4)引擎:

containerd 并发 启动优化

支持shimv2,提升单节点容器密度

镜像下载加速 Lazy loading

Cromwell社区集成

Cromwell是一个流程调度软件,它可以定义不同的作业,这个软件在基因测序以及基因计算领域里应用是比较广泛的。

Cromwell 社区原生支持Volcano

企业版已经上线 华为云 GCS

通过 cromwell 支持作业依赖

Volcano 提供面向作业、数据依赖的调度

Volcano CLI

KubeSim

简介:

集群进行性能测试及调度的描述工具

不受资源限制,模拟大规模K8S集群

完整的K8S API调用,不会真正创建pod

已经支持产品侧大规模专项及调度专项的模拟工作

总体结构:

Worker cluster:承载kubemark虚拟节点,hollow pod

Master cluster:管理kubemark虚拟节点,hollow node

Hollow pod = hollow kubelet + hollow proxy

社区活跃度:

• 1.4k star,300+ fork,150+ 贡献者

• 3 Maintainer,7 Reviewer

• 30 家企业、科研机构

目前使用Volcano的部分企业

点击关注,第一时间了解华为云新鲜技术~

一文带你解读Volcano架构设计与原理的更多相关文章

  1. dubbo源码解析五 --- 集群容错架构设计与原理分析

    欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...

  2. 限流降级神器,带你解读阿里巴巴开源 Sentinel 实现原理

    Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 大家可能会问:Se ...

  3. 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。

    前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...

  4. 一文带你解读:卷积神经网络自动判读胸部CT图像的机器学习原理

    本文介绍了利用机器学习实现胸部CT扫描图像自动判读的任务,这对我来说是一个有趣的课题,因为它是我博士论文研究的重点.这篇文章的主要参考资料是我最近的预印本 “Machine-Learning-Base ...

  5. Dubbo架构设计及原理详解

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...

  6. 干货,一文带你超详细了解Session的原理及应用

    session 简介 session 是我们 jsp 九大隐含对象的一个对象. session 称作域对象,他的作用是保存一些信息,而 session 这个域对象是一次会话期间使用同一个对象.所以这个 ...

  7. 2、Hdfs架构设计与原理分析

    文章目录 1.Hadoop架构 2.HDFS体系架构 2.1NameNode 2.1.1元数据信息 2.1.2NameNode文件操作 2.1.3NameNode副本 2.1.4NameNode心跳机 ...

  8. 一文带你弄懂 Maven 拉包原理

    业务需求开发的时候,我们总是会遇到拉不到依赖包的情况.此时如果不清楚 Maven 拉取依赖包的原理,那么很可能找不到问题所在.今天树哥就带大家了解下 Maven 拉包的原理,让你在遇到问题的时候能快速 ...

  9. 干货,一文带你超详细了解 Filter 的原理及应用

    提出问题 1.我们在访问后台很多页面时都需要登录,只有登录的用户才能查看这些页面,我们需要   在每次请求的时候都检查用户是否登陆,这样做很麻烦,有没有一种方法可以在我们请求之   前就帮我们做这些事 ...

  10. 一文带你弄懂 CDN 技术的原理

    对于 CDN 这个东西,相信大家都有耳闻,感觉既陌生但又熟悉.最近深入了解了一下 CDN,这才发现原来 CDN 如此重要!今天就跟大家科普一下 CDN 是什么,以及为啥要有 CDN,最后再讲一下 CD ...

随机推荐

  1. python包引用方式总结

    本文为博主原创,转载请注明出处: 在Python中,有多种引用包的方式.以下是常见的方式: 1. import语句 import语句是最常见和推荐的引用包的方式.它允许你引入整个包或包中的特定模块/子 ...

  2. 如何在 Vue.js 中引入原子设计?

    本文为翻译文章,原文链接: https://medium.com/@9haroon_dev/introducing-atomic-design-in-vue-js-a9e873637a3e 前言 原子 ...

  3. codeforces #864 div2 B

    GCD Partition 这道题首先要解决一个问题,要把区间分成几块,可以证明分成两块是更优 首先我们假设把区间分成了m(>= 2)块 b1, b2, b3, ...,bm,则答案是gcd(b ...

  4. 【Qt6】列表模型——几个便捷的列表类型

    前面一些文章,老周简单介绍了在Qt 中使用列表模型的方法.很明显,使用 Item Model 在许多时候还是挺麻烦的--要先建模型,再放数据,最后才构建视图.为了简化这些骚操作,Qt 提供了几个便捷类 ...

  5. JVM指令分析

    代码: 1 public class AppGo{ 2 public static void test() { 3 boolean flag = true; 4 if (flag) System.ou ...

  6. 圆方树 useful things

    圆方树,是解决仙人掌问题的实用方法,假设最初图都是圆点,对于每个环新建一个方点并连接这个环上所有圆点,能很好规避同一个点可能属于很多个环的情况,并且发现build完之后是一棵树 广义圆方树,能够不局限 ...

  7. 聊聊魔塔社区MGeo模型的部署与运行

    从现今与今后的发展来看,单一的业务不再仅仅依靠于传统的技术开发,而是应该结合AI模型来应用.实践.只有这样,才能更数智化,更高效化,更贴合时代的发展. 魔塔 社区就类似国外的Hugging Face, ...

  8. bad_python

    对着正确的pyc文件在010把题目文件的前缀改掉,然后在线反编译得到代码

  9. rust程序设计(5)结构体相关练习题| 附带解答

    题目 基础结构体练习: 创建一个名为Person的结构体,包含name(字符串类型)和age(整数类型)两个字段. 写一个函数,接收一个Person实例作为参数,并打印出这个人的名字和年龄. 结构体方 ...

  10. (数据科学学习手札155)基于martin为在线地图构建字体切片服务

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在之前的一篇文章(基于mart ...