第二个问题,什么样的应用适合混部?适合混部的应用有两类:一类是算力要求很高的周期性应用,通常是一些离线计算任务。一类是容易造成资源浪费的应用,通常是一些长时间运行的、具备潮汐现象的在线服务。但要注意,有些在线服务会对某些资源有较高的敏感性,这类服务是对混部系统的最大挑战,因为稍有不慎就会偏离混部的目的,影响了在线服务质量,得不偿失。
在确定了这两个问题之后,我们来看下混部系统需要有哪些机制。通常分为三层:
一是对混部应用进行特征画像、定级以及分配资源配额的应用管理层。这一层定义应用的级别,混部的时机,以及通过配额保证资源分配不失控。
二是对混部集群进行调度、隔离、资源复用和避让的核心系统。这一层是混部的核心,基本决定了我们的集群能达到什么样的混部效果。
最后,还需要一整套适配的自动化运营系统。
混部的基本原理是对闲置资源的再分配。通常,闲置资源有两个来源。集群内会有碎片资源,这是资源分配颗粒度问题导致的,这些碎片资源可以分配给颗粒度更小的应用使用。另外,在线服务申请的资源通常会大于实际使用的资源,配合应用画像,预测出这部分服务的波峰波谷,可以将这部分闲置资源分配给其他应用。
基于这个背景,引申出混部最核心的两个子模块:资源复用和任务避让。顾名思义,资源复用就是把上述两种闲置资源通过预测、回收的机制,实时再分配给混部应用使用。而任务避让,就是检测核心在线服务是否收到了混部的影响。一旦发生干扰,马上触发冲突处理机制,进行压制和再调度等操作。
可以这么说,这两个模块决定了混部的效果和可混部的应用范围。除了理论上的问题,还有一些重要的点必须考虑:为了保证混部效果,频繁对集群实时情况进行预测和资源回收,对集群本身带来了额外的负担,如何在尽可能资源复用和尽量降低资源预测回收频率之间找到平衡?还有,为了保证在线服务的质量,任务回避通常不可避免,这就降低了次优先级应用的执行效率,高负载时可能导致任务的频繁重试和堆积,进而可能拖累整个集群。
为了解决这些问题,腾讯云云原生团队做了一直在思考和尝试,目前较先进的一种方式是通过 serverless 容器即弹性容器,来拓展整个混部集群的资源池。
弹性容器是腾讯云推出的无服务器容器产品。它支持一种能力,类似开源virtual kubelet 的方式,但又相比开源方案能力更强、更适合生产。它支持在一个既有 K8s 集群中通过部署虚拟节点的方式把 pod 调度为弹性容器。调度为弹性容器的 pod 与原集群中的其他 pod 网络互通,如果关联了service ,service间也可互通。
所以无论是已有 workload 的扩容、还是新的 workload,都可以以一种平滑的方式进行调度。且该能力对集群不会产生额外的维护成本。
这个能力对混部的核心价值在于:它无成本的扩展了集群资源池,降低了资源冲突的风险,提升了混部集群的冗余度和适用性。另外,在检测到资源不足之类的冲突时,在很多场景可以不中止次优先级任务,而是视情况扩容或再调度,在弹性容器上继续运行任务,秉持尽量不打断已启动任务的原则,提升整个系统的效率。
这类混部集群的几个典型场景:
1、低负载时进行任务填充,运行更多任务,提升集群资源利用率。
2、万一发生了在线服务干扰,封锁相关节点,驱逐次优先级任务到虚拟节点,让其继续运行。