华为云架构师深度解读 Volcano 云原生混部解决方案
本文来源:《华为云DTSE》第五期开源专刊,作者:王雷博 华为云架构师、常旭征 华为云高级工程师
随着云原生技术的快速发展,越来越多的业务已逐渐迁移到 Kubernetes,使用云原生化的方式进行开发维护,极大地简化了应用程序的部署、编排和运维,Kubernetes 已逐渐成为云原生时代的“操作系统”。但在另一方面,应用云原生技术之后,数据中心的资源使用率仍然较低,为了提升资源利用率同时保障高优先级业务的 SLO,Volcano 推出了云原生混部解决方案,从应用层到内核提供端到端的资源隔离与共享机制,最大化提升资源利用率。
背景
何为云原生混部
企业部署的业务类型从其运行特点来看,大致可以分为两类:在线业务和离线业务,分别有如下的特征。
云原生混部是指通过云原生的方式将在线业务和离线业务部署在同一个集群。由于在线业务运行具有明显的波峰波谷特征,因此当在线业务运行在波谷时,离线业务可以利用这部分空闲的资源,当在线业务到达波峰时,通过在线作业优先级控制等手段压制离线作业的运行,保障在线作业的资源使用,从而提升集群的整体资源利用率,同时保障在线业务 SLO。云原生混部示意图如下。
为什么需要云原生混部
根据 Gartner 的统计,企业数据中心的 CPU 平均使用率不足 15%,造成集群利用率低的原因有多种,典型场景有:
资源碎片化:不同业务部门资源池独立。
业务波峰波谷:在线业务具有明显日级别波峰、波谷特性,用户为保证服务的性能和稳定性按照波峰申请资源。
资源配置不合理:部分用户对于自己服务的资源使用情况不了解,申请资源时具有盲目性,通常申请过量资源。
业务容器化之后,能一定程度上提升资源利用率,但以下场景单纯依赖容器化仍然无法得到有效解决:
资源池统一:K8s 原生调度器缺少组、队列等高阶调度能力;大数据业务存算一体难以利用容器弹性优势。
应用部署密度:单纯增加部署密度难以保证服务质量。
应用绑核:部分应用为了稳定性,设置绑核,独占资源,整体利用率降低。
资源过量申请:超额申请、积沙成塔造成资源浪费。
弹性门槛:业务难以做到无感扩缩容。
基于以上现状,我们需要在保障在线业务 Qos 的情况下,通过资源隔离、资源统一调度等手段提升云原生化之后数据中心的资源利用率。
业界实践
业界有较多的公司和用户对在离线混部技术进行了不同程度的探索与实践,为在离线混部提供了积极有益的设计与实践,但也存在一些不足之处,比如不能做到和 Kubernetest 完全解耦,超卖资源计算方式粗糙,在离线作业使用方式不一致、用户体验不友好等问题。
基于以上考虑,我们针对在离线混部技术进行了进一步的增强与优化,对比业界的在离线混部我们具有如下的优势:
调度器天然支持离线作业调度与管理。
对 Kubernetest 无侵入式修改。
超卖资源实时动态计算,更好保障业务 Qos。
OS 层面的隔离与 Qos 保障。
Volcano 云原生混部方案
整个云原生混部架构主要包括 Volcano、Volcano agent、Enhanced OS 几部分。
Volcano:负责在离线作业的统一调度,提供队列、组、作业优先级、公平调度、资源预留等多种抽象,统一满足微服务、大数据、AI 等业务调度需求。
Volcano agent:集群内的每个节点都会部署一个 Volcano agent,动态实时计算每个节点已经分配但未使用的资源,将这部分资源进行超卖,供离线作业进行使用。同时对节点 Qos 进行保障,在检测到节点出现 CPU/Memory 压力时,对离线作业进行驱逐,保障在线业务的优先级。
Enhanced OS:Volcano agent 会在上层业务层面进行节点级别的 Qos 保证,为了进行更加精细化和强制性的隔离,内核层面也需要区分 Qos 类型,在 CPU/Memoey/Network/L3 cache 等层面进行隔离,内核暴露了一系列的 cgroup 接口,Volcano agent 通过为在离线业务设置不同的 cgroup,做到内核层面的精细隔离,实现在线作业对离线作业的压制。
混部 Qos 模型
将在线和离线作业混合部署在一个集群之后,由于离线作业通常是 CPU 或者 IO 密集型任务,因此会对在线作业造成干扰,导致在线业务 Qos 受损,为了尽可能降低离线业务对在线业务的干扰,需要对在线和离线业务进行 Qos 分级管控,通过对在线和离线作业进行标识来定义 Qos 模型,进而在运行态优先保障在线业务 Qos,降低离线作业对在线的干扰。
根据在线和离线作业的分类和运行特点,Volcano 对在线和离线作业做了模型抽象,定义了不同的 Qos 等级,不同类型的业务可以设置不同的 Qos 等级,同时在内核层面映射到 CPU 和 Memory 等级,更高的等级将会获得更高的资源使用权和抢占优先级。在调度时会区分不同 Qos 等级对应的作业类型,执行丰富的调度策略,同时通过 Volcano agent 调用内核接口为在离线作业设置不同的 Qos 优先级。Qos 模型定义如下:
Qos 等级分为 LC(Latency Critical) 、HLS(Highly Latency Sensitive) 、LS(Latency Sensitive)和 BE(Best Effort)。
LC 表示时延敏感极高的核心在线业务,会独占 CPU,HLS 表示时延敏感极高的在线业务,LS 表示时延敏感型的近线业务,BE 表示离线的 AI、大数据业务,并可以容忍驱逐,同时对应到内核层面有着不同的 CPU 优先级,CPU 优先级越高则在内核层面有更高的运行和抢占优先级,Memory 优先级-1 表示节点发生 OOM 时优先 kill 掉离线作业。
可以通过设置作业对应 Pod 的 annotation 来表示不同的作业类型,比如设置 volcano.sh/qos-level=“LS”即代表 Pod 为时延敏感型的近线作业,设置 volcano.sh/qos-level=“BE”即代表 Pod 为离线作业。
统一资源调度
将在线和离线作业同时部署在一个集群时,使用多个调度器分别调度不同类型的作业时,每个调度器都可以看到全局的资源视图,多个调度器在进行节点资源计算和绑定时,就极有可能存在并发资源更新冲突,为了避免这一问题,需要用统一的调度器调度在线和离线作业。
Volcano 作为业界首个云原生批量计算项目,天然支持 AI/Big Data 作业的调度和管理,并且支持多租户的队列管理和公平调度,统一支持几乎所有主流的计算框架,包括 Pytorch、MPI、Horovod、Tensorflow、MindSpore、Paddlepaddle、Mxnet、Argo、Kubeflow、Spark、Flink、Ray 等。并且集成了 K8s 默认的调度算法,支持批处理作业微服务的统一调度,根据作业的 Qos 模型进行优先级调度。因此支持在线和离线作业的统一调度。
动态资源超卖
Kubernetes 现有的资源调度模型基于 Pod 的 requests 进行计算,而用户在设置资源 requests 时往往具有盲目性,requests 值设置较大而实际使用量很少,导致资源浪费。同时对于在线作业而言,其运行规律具有明显的波峰波谷特征,因此在业务运行低谷时期,非常适合将未充分使用的资源进行二次超卖,给离线作业使用,从而提升集群的资源利用率。
Volcano agent 实时计算 Pod 已经申请但未使用的资源,将这部分资源动态超卖给离线作业使用,提高 Pod 部署密度,提升资源利用率。
由于超卖资源的增加,改变了节点原有的资源可用量,且超卖资源单独给离线作业使用,因此对于超卖资源的计算、上报方式和使用方式会有不同的方案选择。为了更好地与 Kubernetes 解耦,以及支持用户自定义设置超卖资源的表现形式,Volcano 提供了 native、extend 等超卖资源计算和上报模式,native 的模式会上报超卖资源至节点的 allocatable 字段,这样一来在线和离线作业的使用方式是一致的,提升了用户体验 ,而 extend 模式支持将超卖资源以扩展方式上报至节点,做到和 Kubernetes 的解耦,用户可以根据实际需求灵活选择超卖资源的上报和使用方式。
Qos 保障
将在线和离线作业混合部署后,由于离线作业和在线作业会发生资源争用,离线作业会对在线业务造成干扰,因此在资源利用率提升的同时还需要保障在线作业的 Qos,避免离线业务对在线业务的干扰。
在离线作业通常会使用多种不同维度的资源,因此需要对各个维度的资源设置资源隔离措施,Volcano 会通过内核态接口设置 CPU、Memory、Network 等维度的资源隔离,当在离线作业发生资源争用时,压制离线作业的资源使用,优先保障在线作业 Qos。
CPU:OS 层面提供了 5 级 CPU Qos 等级,Qos 等级越高则代表可以获得更多的 CPU 时间片并有更高的抢占优先级。通过设置 CPU 子系统的 cgroup cpu.qos_level 可以为不同业务设置不用的 CPU Qos。
Memory:Memory 隔离体现在系统发生 OOM 时离线作业会被有限 OOM Kill 掉,通过设置 memory 子系统的 cgroup memory.qos_level 可以为不同业务设置不同的 Memory Qos。
Network:网络隔离实现了对在线作业的出口网络带宽保障,它基于整机的带宽大小,并通过 cgroup + tc + ebpf 技术,实现在线作业对离线作业的出口网络带宽压制。
上图为网络隔离的技术方案,通过 ebpf 将限速程序注入到 kernel,实现对报文转发的控制,从而达到限速的目的。cgroup ebpf 可以为在离线业务的的报文设置不同的标签以区分在线和离线业务流量,tc ebpf 可以设置三个水位线:在线业务水位线,离线业务高水位线和离线业务低水位线。当在线业务流量超过水位线时,限制离线作水位带宽,离线业务带宽使用上限为离线业务低水位线,避让在线流量;当在线业务流量低于水位线时,放开对离线作业的带宽限制,离线业务带宽使用上限为离线业务高水位线,提高资源利用率,同时可以根据离线流量带宽计算报文的发送时间(EDT),实现离线作业流量限速。
实践效果
华为消费者云是华为智能终端设备的“大脑”。为终端提供云服务支撑,围绕数据、应用、出行、娱乐等提供全场景、高品质的数字生活体验。在生产实践中,消费者云的业务由于业务规模、复杂性等原因面临着诸多挑战,主要有以下几个方面:
大规模以及多样性的应用类型。
业务复杂,应用类型繁多,100000+ pods
大量资源规格,多种节点类型 (ARM/X86), 46w+ cores
对弹性有很高要求,2w+ 应用开启
极致用户体验,应用要求低时延。
应用资源使用具备明显的潮汐特征,资源使用率低。
为了解决以上问题挑战,终端云采用了在离线混部解决方案解决实际业务中遇到的问题,主要包含以下措施:
切换 Volcano 作为统一的在离线任务调度器。
统一使用 Volcano 作为在线和离线作业的调度器后,实现了对在离线作业的统一管理,提升了调度效率,同时为调度器提供了统一的调度视图,避免了多调度器并发调度时资源竞态问题,再利用 Volcano 的队列管理、作业管理、优先级调度、公平调度等机制,实现了资源利用率的提升。
使用 Volcano 丰富的调度策略提升资源分配率,如 NUMA awareness、Pod 及 Node Flavor 匹配、重调度、装箱、负载感知调度策略等。
通过这一系列的调度策略极大地提升了集群资源利用率,同时通过 NUMA awareness 弥补了 kube-scheduler 缺失的 NUMA 调度能力,Volcano 可以识别到节点上的 NUMA 使用情况,从而保证 Pod 调度到节点上之后,可以使用指定 NUMA Topology 策略的 NUMA 节点。
在离线混部,动态资源超卖,提升集群使用率。
在线作业的运行通常具有潮汐特征,而且通常会申请过量资源,Volcano 通过计算在线作业已分配但未使用的资源,将这部分资源进行动态超卖,离线作业就可以使用在线作业的空闲资源,从而提升节点的 Pod 部署密度,进而提升整个集群的资源利用率。
通过统一调度、资源超卖等在离线混部技术,最终保障了终端云高性能的作业调度,同时在保障 Qos 前提下,集群分配率提升了 10%+,集群利用率提升了 20%+。
总结展望
通过 Volcano+Agent+Enhanced OS 的方式,Volcano 提供了一套完整的云原生混部解决方案,实现了资源统一调度、在线作业 Qos 保障、动态资源超卖、资源隔离等功能特性,旨在提升资源利用率,助力企业降本增效,并在华为终端云、流程 IT 等进行了广泛的落地实践,解决了客户的痛点问题,对生产实践指导意义重大。目前的内核隔离依赖于 HCE2.0/Open Euler,为了增强扩展性,未来我们会抽象 OS 接口,在 Volcano 侧屏蔽 OS 的差异,不同的 OS 适配统一的接口,实现各自的隔离逻辑,从而支持更多的 OS。
华为开发者空间,汇聚鸿蒙、昇腾、鲲鹏、GaussDB、欧拉等各项根技术的开发资源及工具,致力于为每位开发者提供一台云主机、一套开发工具及云上存储空间,让开发者基于华为根生态创新。
评论