作业帮吕亚霖:作业帮的Serverless虚拟节点落地实践

42c5d91ffd484aba377c2f3ba2502443.gif

嘉宾 | 吕亚霖   整理 | 小雨青年

出品 | CSDN云原生

2022年6月14日,在CSDN云原生系列在线峰会第9期“Serverless峰会”上,作业帮基础架构-架构研发团队负责人吕亚霖分享了Serverless虚拟节点的落地实践。

85527b348f39d1ab1828aa390e8e4372.png

作业帮Serverless的演化历程

作业帮云原生历程的核心目标之一是提升资源利用率,因为Serverless具有弹性伸缩、按量计费、强隔离性特点,并且Kubernetes Serverless虚拟节点和正常节点使用上无差异,所以Serverless成为了作业帮技术架构探索的核心方向。

Serverless的运行方案有两种,一种是函数计算,另一种是K8s虚拟节点。

K8s的虚拟节点具有对现有服务无使用差异、用户体验较好、业务服务无感知的特点,并可以基于现有基础架构进行迁移。

作业帮的Serverless演化大致分为3个阶段:

  • 2020年,尝试将部分密集计算调度到Serverless虚拟节点上,用service虚拟节点的低层强隔离性来规避服务之间的相互影响;

  • 2021年,将定时任务调度到Serverless虚拟节点上,再对节点进行扩缩容,应对短时的定时任务,提高资源利用率、降低成本;

  • 2022年,将核心服务调度到Serverless虚拟节点上,用户服务作为最容易感知的服务,拥有最明显的波峰波谷,通过高峰期将服务调度到Serverless节点上,带来了巨大的成本收益。随之而来的要求也在提高,要尽可能保证服务稳定性和业务感知与物理机一致。

e5150dc39efa4c566331a925325c802a.png

Kubernetes Serverless虚拟节点

虚拟节点并不是真实的节点,而是一种调度能力,支持将标准Kubernetes集群中的Pod调度到集群服务器节点之外的资源中。

如下图所示,Service的Pod既存在于物理服务器中,又存在于虚拟节点中,用户在实际使用中并没有感知差异,并且节点的网络也是互通的。

作业帮吕亚霖:作业帮的Serverless虚拟节点落地实践_第1张图片

ff2c994ca5866c2ad31eb621fe308fe0.png

定时任务场景下Serverless化问题

问题背景

首先是定时任务本身的特点导致了资源利用率不高:

  • 任务普遍执行时间短,90%任务运行时间在一分钟内;

  • 任务执行启动时间集中,最高峰为00:00:00或者整点。

其次是Kubernetes CronJob的问题:

  • CronJob Pod频繁销毁重建导致cgroup memory回收影响内核态;

  • 在00:00:00,上万个任务JOB启动,Kubernetes原生调度器是串行调度,调度延迟明显;

  • 任务中有很多计算或者I/O密集型,这种服务会大量抢占节点CPU或者I/O,而cgroup的隔离并不彻底。

解决方案

如果把定时任务调度到Serverless虚拟节点上,那么只需要在运行任务的时间产生费用,而大部分任务的运行时间都在一分钟左右,这样来看对于成本的控制非常有效。

在这基础上,团队做了款自研调度器,能做到:

  • 适用CronJob Workload;

  • 因为不需要锁节点资源,可以并行调度;

  • 支持事件监听,Serverless出现问题时,将F0级别任务调度回正常节点。

规模和收益

下图为当0点的峰值时,Pod的峰值数量在两万多个,相比之下,资源的使用下降40%,是非常可观的。

作业帮吕亚霖:作业帮的Serverless虚拟节点落地实践_第2张图片

806454bd30529eead9a60d900e6cfa52.png

在线业务场景下Serverless化问题

问题背景

如下图所示,在线业务场景的特点是时间周期特征名称,具体表现为:

  • 高峰时段是平峰时段的20倍,低峰时段的上百倍;

  • 流量上升曲线较陡;

  • 凌晨到5点前流量较少。

作业帮吕亚霖:作业帮的Serverless虚拟节点落地实践_第3张图片

预期收益

假设全部使用自有服务器每小时的成本为C,平均每天高峰期的时间为4小时,使用Serverless的单位时间成本为1.5C,那么,全部使用自有服务器的总成本为C * 24 = 24C;保留70%的自有服务器,高峰期增加30%的Serverless来应对,此时的总成本为:C * 24 * 0.7 + 1.5C * 4 * 0.3 = 18.6C。

理论收益为(24C - 18.6C)/ 24C = 22.5%。

解决方案

业界内使用Serverless虚拟节点经历了几个阶段:

  • 虚拟节点和标准节点是完全分开地调度到指定的虚拟节点;

  • 用户不用指定selector,当Pod因节点资源不足调度pending的时候,会自动调度到虚拟节点上;

  • 调度器支持当资源不足时自动调度到虚拟节点上。

作业帮团队目前使用自研在线服务调度器:

  • 扩容:基于在线服务的波峰波谷,进行预测推荐调度,预测高峰该服务能在集群物理机上运行的副本数阈值,通过自研调度器将超过阈值的Pod调度到虚拟节点上;

  • 缩容:自研调度器对虚拟节点上的Pod注入自定义的注解,修改kube-controller-manager的缩容逻辑,将带有虚拟节点自定义注解的Pod置于缩容队列的顶部,来完成优先缩容虚拟节点上的Pod。

自研在线服务调度器的优势在于,通过预测调度既能满足物理机集群的利用率,也能满足性能要求。

如下图所示,通过高峰时期扩容Pod到Serverless,可以将集群常备机器数量减少30%,降低资源的平均利用率。

作业帮吕亚霖:作业帮的Serverless虚拟节点落地实践_第4张图片

c5a49148e7d42d68737716e176eda646.png

Serverless虚拟节点和正常节点差异

Serverless虚拟节点和正常节点的差异具体表现为两个方面。

第一,观测性差异。因为是虚拟节点,没有物理机的daemonset,所以观测服务的agent是由云厂商内置的。我们需要保证业务观测感知层面上,Pod运行在Serverless虚拟节点和物理服务器上一致,所有就有一个转化到我们自有观测服务的过程。

第二,底层性能差异。Serverless虚拟节点底层性能差异。由于底层计算资源规格的不同以及虚拟化层带来的开销,性能可能和裸金属服务器有所差异。不得不提的是,这里可能会有云服务器库存风险。高峰期大量扩容,如果云厂商某个规格的的资源池水位低,可能会扩不出来指定规格的资源。

综上所述,Serverless虚拟节点为企业业务的高峰扩容带来了显著的效益,能有效降低成本和提升资源利用率。

你可能感兴趣的:(大数据,java,编程语言,hadoop,kubernetes)