本文来源于《华为云DTSE®》第五期开源专刊,更多文章请查看:https://bbs.huaweicloud.com/blogs/435823
作者:王雷博 华为云架构师、常旭征 华为云高级工程师
摘要: 随着云原生技术的快速发展,越来越多的业务已逐渐迁移到Kubernetes,使用云原生化的方式进行开发维护,极大地简化了应用程序的部署、编排和运维,Kubernetes已逐渐成为云原生时代的“操作系统”。但在另一方面,应用云原生技术之后,数据中心的资源使用率仍然较低,为了提升资源利用率同时保障高优先级业务的SLO,Volcano推出了云原生混部解决方案,从应用层到内核提供端到端的资源隔离与共享机制,最大化提升资源利用率。
背景
何为云原生混部
企业部署的业务类型从其运行特点来看,大致可以分为两类:在线业务和离线业务,分别有如下的特征。
云原生混部是指通过云原生的方式将在线业务和离线业务部署在同一个集群。由于在线业务运行具有明显的波峰波谷特征,因此当在线业务运行在波谷时,离线业务可以利用这部分空闲的资源,当在线业务到达波峰时,通过在线作业优先级控制等手段压制离线作业的运行,保障在线作业的资源使用,从而提升集群的整体资源利用率,同时保障在线业务SLO。云原生混部示意图如下。
为什么需要云原生混部
根据Gartner的统计,企业数据中心的CPU平均使用率不足15%,造成集群利用率低的原因有多种,典型场景有:
• 资源碎片化:不同业务部门资源池独立。
• 业务波峰波谷:在线业务具有明显日级别波峰、波谷特性,用户为保证服务的性能和稳定性按照波峰申请资源。
• 资源配置不合理:部分用户对于自己服务的资源使用情况不了解,申请资源时具有盲目性,通常申请过量资源。
某业务资源需求统计:波峰波谷明显
业务容器化之后,能一定程度上提升资源利用率,但以下场景单纯依赖容器化仍然无法得到有效解决:
• 资源池统一:K8s原生调度器缺少组、队列等高阶调度能力;大数据业务存算一体难以利用容器弹性优势。
• 应用部署密度:单纯增加部署密度难以保证服务质量。
• 应用绑核:部分应用为了稳定性,设置绑核,独占资源,整体利用率降低。
• 资源过量申请:超额申请、积沙成塔造成资源浪费。
• 弹性门槛:业务难以做到无感扩缩容。
Twitter数据中心资源统计:实际远小于预留
基于以上现状,我们需要在保障在线业务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,做到内核层面的精细隔离,实现在线作业对离线作业的压制。
Volcano云原生混部架构图
混部Qos模型
将在线和离线作业混合部署在一个集群之后,由于离线作业通常是CPU或者IO密集型任务,因此会对在线作业造成干扰,导致在线业务Qos受损,为了尽可能降低离线业务对在线业务的干扰,需要对在线和离线业务进行Qos分级管控,通过对在线和离线作业进行标识来定义Qos模型,进而在运行态优先保障在线业务Qos,降低离线作业对在线的干扰。
根据在线和离线作业的分类和运行特点,Volcano对在线和离线作业做了模型抽象,定义了不同的Qos等级,不同类型的业务可以设置不同的Qos等级,同时在内核层面映射到CPU和Memory等级,更高的等级将会获得更高的资源使用权和抢占优先级。在调度时会区分不同Qos等级对应的作业类型,执行丰富的调度策略,同时通过Volcano agent调用内核接口为在离线作业设置不同的Qos优先级。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。