引言:集群管理的一个重要目标是提高资源利用率,随着集群规模的扩大,基础设施成本上涨,资源利用率问题逐步突显,为降低成本,混部技术应运而生。本篇文章结合腾讯技术团队在混部方面的落地和实战经验,来介绍各类场景下在线离线混部的相关概念、面临的问题及混部技术方案,抛砖引玉,供大家交流。
混部背景
各大厂商都有自己的集群管理平台,典型的是以k8s(kubernetes)为代表的容器云平台,集群管理的一个重要目标便是提高资源利用率,随着集群规模的扩大,机器成本增加,资源利用率问题开始变得越来越重要。造成集群利用率低的原因有多种,如:
(1) 集群碎片
(2) 业务专有集群,不共享
(3) 部署多个副本用于容灾处理
(4) 空闲buffer资源池用于临时扩容
(5) 用户对资源预估不准,申请量高于实际使用资源量
(6) 应用资源有潮汐现象,用户按照高峰时段使用量申请资源
如图1是线上业务的典型资源曲线,最上面这条蓝线是资源申请值,红色线是实际使用值,我们看到request和usage之间有很大gap,这个例子是30%左右,因为业务对资源的评估不可能完全精准,还要留出一定buffer,另外,波峰和波谷也有40%的波动,最终导致平均利用率降低。
图1 典型在线应用资源使用曲线
传统裸机部署应用的集群,利用率会更低些,一是应用本身潮汐现象,二是裸机部署受限于端口或共享资源,大部分情况只能部署一个实例,不能像k8s那样在一个节点部署多个实例。另外传统应用为了应对流量突发,会维持一个备用资源池,这也造成了资源浪费。
针对不同的原因有不同的解决方式,如集群碎片问题,可以通过申请更小的资源量或重调度来解决,或如针对空闲buffer资源池,可以通过k8s的HPA实现动态扩缩容。但这些问题可以通过一个统一的方式来解决,那就是在线离线混部,这也是各大云厂商这几年深耕的领域。混部领域的喜马拉雅山是Google Borg,其在2019年发布的论文Borg中,集群的cpu利用率通过混部技术达到50%。如何通过混部技术提高集群利用率,是每家集群大规模后不可避免的问题。
集群规模越大,成本问题越突显,以图1为例,该实例平均有7.5-3.56=3.94个core空闲,若部署1k个此类实例,则就有将近4k个core空闲。在线离线混部可以把这些空闲资源充分利用起来,降低集群成本。若集群总共有500w核,通过混部提高10%的利用率,就可以节约50w核,还是很可观的。
混部概念
提高集群资源利用率有几种方式,一是集群本身合理配置应用申请资源,尽量运行更多的作业。二是在波谷时段填充其他作业,运行更多的作业。第一种方式适合不同类型的应用混部,应用之间资源互补,高峰时段错开。若是同种类型的应用,应用都在同一时段处于高峰,这种情况适合第二种方式。本篇文章主要是讲基于方式二的混部,即在线离线混部。
在线离线混部是通过在在线作业运行过程中填充离线作业,来提高资源利用率。离线任务不能无限填充,需要保证在线作业不受影响,保证其SLO在可接受范围内,同时离线作业要能快速上线下线,当在线作业需要资源的时候,及时出让。另外,离线运行起来之后,还要保证离线作业的成功率,不能因为频繁出让资源,而导致失败率很高。
混部场景
混部概念中将应用类型分为在线作业和离线作业,混部要解决的问题是如何通过填充离线作业把集群各个时段的在线空闲资源利用起来。集群每个时段的空闲资源会发生变化,这就要求离线作业要快速上线下线。那