APP下载

面向微服务的容器伸缩策略

2023-08-10吕晓丹

计算机应用与软件 2023年7期
关键词:容器数量预测

曾 理 吕晓丹

1(贵州大学计算机科学与技术学院 贵州 贵阳 550025) 2(贵州省公共大数据重点实验室 贵州 贵阳 550025)

0 引 言

微服务是一种将系统分解为小型、独立、自治的服务体系结构,可以更轻松地在云环境中进行部署。它解决了传统的单片架构随着应用程序通过子模块部署的应用扩展而降低了开发效率并增加了维护成本的问题。容器作为一种轻量级的虚拟化技术,在微服务的开发中起着重要的作用,可以大大提高部署环境的一致性并更好地利用资源。通常一种服务放置于一个容器中,因此微服务资源的弹性伸缩可以看成容器副本数的增加和减少。当前大多数资源调度都是针对传统的虚拟机技术,但是传统的虚拟机技术与容器技术本质上不同。容器的启动速度以秒为单位,而虚拟环境的启动一般需要5~15 min[1]。与裸机相比,容器的性能几乎没有损失,但是虚拟机有明显损失。基于上述容器的两个特征,可以更容易地实现容器数量的伸缩。

然而容器进行伸缩的时机尤为重要,伸缩算法的性能很大程度上取决于资源响应时间。云资源的自动伸缩的过程主要可以分为两类:响应式和主动式[2]。响应式算法根据系统的当前状态扩展,虽然这样满足实时和容易扩展的要求,但在准确性方面,由于云服务负载状态变化频繁和数据传输延迟等原因[3]使得获得的负载值存在很大的滞后性,这样可能会导致服务QoS下降,无法满足客户的要求,甚至会使得云服务提供商的成本增加[4]。主动式扩展方法适用于云环境,尤其是在负载突然增加或者减少的时候,预测算法可预测将来的需求,然后根据预测结果主动进行资源的自动伸缩。

多年来,工业界和学术界一直在积极地研究微服务中容器调度问题。在学术界有关微服务下的容器调度算法较少,因此尚未在该领域进行比较全面的比较评估。郭杨虎[5]提出基于邻域划分的容器调度策略,将依赖关系紧密的服务尽量放在同一台物理服务器上,以减少系统调用。这种方法没有考虑多副本的服务情况。文献[6-8]根据当前资源使用情况通过提出动态容器调度策略,从而提高资源利用率。针对突发的服务负载,这种方法可能会降低QoS。文献[9-11]通过时间序列预测方法对负载进行预测,根据预测结果对容器数量进行自动伸缩。但是并没有对容器伸缩的数量进行量化。关于时间序列预测模型,目前 ARIMA模型在时序预测方面有比较广泛的应用,文献[10,12-13]选ARIMA来进行负载预测,虽然建模方式上有所不同,但通过使用基于预测模型的资源调度算法能够及时、有效地保证云服务质量。

在工业界,为了解决容器的调度和复杂的管理问题,各大公司开发了自己的容器编排系统。其中比较著名的是Google公司的kubernetes、Docker公司的Swarmkit和Apache公司的Mesos[14]。然而Mesos主要的功能是数据中心资源的统一管理,其调度策略较少并且调度策略的实现和使用都比较复杂,对于非专业人员来说不太友好;Swarmkit[15]虽然原生支持docker,但它不能托管服务,开发人员要时刻运行服务发现引擎,并且对于版本的更新不能做到自动化;相较而言kubernetes提供了更加完善的功能,支持自动化的容器部署、扩展和管理。k8s以其强大的服务编排能力和服务管理能力在一众编排系统中脱颖而出。但k8s在进行服务的扩缩容时,使用的扩缩容算法过于简单,使得在服务面对突发负载时,无法保证服务的QoS。

综合上述问题,本文通过使用时间序列预测模型根据最近一个时间区间内的容器负载数据,预测下一个时间区间内的负载。使用预先训练的XGBoost模型,根据预测的负载压力预测下一时间窗口内所需的服务容器数量。本文的主要贡献如下:

1) 本文通过使用时间序列预测模型ARIMA根据最近一个时间区间内的pod负载数据,预测下一个时间区间内的负载,在负载突然上升或者下降时提供扩缩容时机。

2) 基于XGBoost模型,根据预测的负载压力结合pod中CPU和内存使用率预测下一时间窗口内所需的微服务/容器数量。

1 基于时序算法的负载预测

ARMA是由Roy等[16]提出的一种对负载进行预测的时间序列模型。Calheiros等[17]在ARMA模型的基础针对非平稳的序列做了改进,提出差分自回归移动模型ARIMA。ARIMA模型定义如下:

(1)

式中:p为自回归阶数;φi是自相关系数;L是滞后算子;d是差分项;Xt是原序列;q是差分阶数,θi是误差项参数;εt是误差项。差分算子的计算为:

Wt=ΔdXt=(1-L)dXt

(2)

建立ARIMA模型整体流程如图1所示。

图1 ARIMA模型方法流程

ARIMA模型方法主要分为四个步骤:

1) 平稳性检验。对于收集到的样本数据,其中不乏非平稳的序列,若存在上升或下降趋势,则进行差分处理,消去其局部水平或者趋势,得到的数据样本就是平稳的。

2) 模型识别。计算经过平稳化后的数据序列的自相关函数(ACF)和偏自相关函数(PACF),然后分析相关函数图进行模型识别如表1所示。

表1 ACF-PACF模型识别

自相关函数定义如下:

3) 模型定阶。虽然观察自相关和偏相关函数的拖尾和截尾可以给模型定阶,但这种定阶方法往往具有很强的主观性。可以根据信息准则函数赤池信息准则AIC和贝叶斯信息准则BIC来确定模型阶数。

AIC=2k-2ln(L)

(4)

BIC=kln(n)-2ln(L)

(5)

4) 模型检验。通过白噪声进行检验,如果模型的噪声训练通过检验,那么模型完全或者基本符合了数据的相关性,如果不能通过噪声检验,应该重新拟合模型直到通过白噪声检验。

2 基于XGBoost的容器数量预测

2.1 问题定义

随着云计算技术的兴起,容器和微服务两大技术应运而生,容器技术的发展为微服务提供了良好的客观条件,而轻量级的容器技术则为微服务提供了最佳的运行环境。与此同时微服务架构所暴露出来的服务管理和服务发现等问题,促使了服务管理平台的诞生。其中最优秀的管理平台是谷歌推出的kubernetes。图2是基于k8s平台的微服务部署架构。

图2 基于k8s平台的微服务部署架构

微服务与单体应用的区别在于一组微服务只使用一个代码库,实现单一的功能,每个服务可以独立部署独立发布,每个微服务放置于一个容器中。开发人员在部署微服务的时候,通常将一组服务放到一个pod中,同一个pod中的服务共享网络与存储,这样可以使得服务间的通信能力大大提高。在微服务架构下,当负载急剧增加时,可以通过增加该pod中服务/容器数量,降低访问压力;相反pod中容器资源利用低下时,通过减少容器数量来达到节约资源的作用。因此负载发生变化时,服务/容器数量的伸缩数量至关重要。

为了解决上述问题,收集了大量有关负责压力和所需容器数量的数据,建立了实验数据集。每个样本数据都包含了4个标签,分别是CPU使用率、内存使用率、服务的负载压力和容器数量。通过使用XGBoost算法,获得服务的负载、CPU、内存使用情况和容器数量之间的关系,从而达到预测容器数量的目的。实验有两个约束条件,分别是服务质量QoS和资源利用情况。

2.2 XGBoost算法

XGBoost算法是在GBDT基础上对Boosting算法进行改进的机器学习算法。为了防止模型出现过拟合,增强模型的泛化能力,加入模型复杂度的正则表达式项。同时对损失残差使用二阶泰勒展开。相较于其他分类算法,该算法的训练速度和分类效果有着显著的提升。

XGBoost是通过随机地进行特征分裂来生成树,也就是为了拟合前面预测的损失残差,每次学习一个新的函数f(x),最后将k棵树的结果求和作为最终的预测值。

(6)

Γ={f(x)=ωq(x)}(q:ω∈RT)

(7)

式中:xi代表第i个样本;k表示树的数量;T是对应树的叶子节点个数;q表示将树与对应的叶子节点映射的空间结构;f(x)包括该树的空间结构和叶子节点的权重;ω表示叶子节点的权重。

(8)

由于式(9)无法使用传统方法进行优化,因此在模型训练时,使每一轮训练都会保留前t-1模型的预测,这样就大大减少计算复杂度,式(10)为新的目标函数。

(10)

为了方便计算损失函数L(φ),直接基于损失函数的二阶泰勒展开式来求解,分别对损失进行一阶导和二阶导获得:

通过把所有叶子节点区域和每个叶子节点区域最优值训练,将叶子节点最优值代入目标函数,最终的目标函数可以表示为:

(12)

最后目标函数基于最大分数对应的特征分裂子树,通过不断的迭代得到弱学习器,然后更新强学习器。

大量实验表明CPU、内存、服务负载是调整容器数量的重要的三个因素。这三个特征组成特征样本输入XGBoost进行模型预测。算法步骤如算法1所示。

算法1基于XGBoost的容器数量预测算法

输入: 训练集S=(xi,yi),(xi+1,yi+1),…,(xn,yn),特征集合F。

输出: XGBoost Tree。

function (S,F)

fork=1 to m do

GL=0,HL=0

foriin sorted(Ik,xik) do

GL=GL+gi,HL=HL+hi

GR=G-GL,HR=H-HL

end

end

Return The learned Tree XGBoost

end function

3 实 验

3.1 实验环境

本实验选取贵州翔明云科技公司微服务化的ERP系统,部署于kubernetes平台上。本实验硬件环境:采用5台戴尔服务器,内存:DDR3 1 066 MHz,CPU:E5506。其中:3台服务器作为master节点,其中2台既作为master节点也作为node节点;剩余2台作为node节点。集群硬件环境如表2所示。

表2 集群硬件环境表

3.2 服务负载预测效果对比

为了验证时序预测方法的有效性,采集贵州翔明云的ERP系统五月到七月三个月的负载数据,从数据库获得负载数据,将前面三个月数据作为训练集,选取后面8月1日8点到12点的数据作为测试集,然后使用ARIMA模型进行训练,预测结果如图3所示。

图3 负载预测结果对比

可以看出本文的预测方法对突发负载保持了较好的预测精度,通过原始数据与预测数据曲线对比,ARIMA模型的预测方法能够很好地预测负载。

3.3 容器数量预测效果对比

为了验证本文提出的XGBoost预测方法的有效性,对比kubernetes自带的HPA(Horizontal Pod Autoscaler)算法。HPA通过Metrics API 获取CPU、内存等资源信息,其算法原理是调整容器副本数目使得资源使用率尽量向期望值靠近,每次Pod伸缩的数量算法为:Ceil(当前采集到的资源使用率/用户自定义的使用率)×Pod数量。

对比图4和图5可以发现,在负载上升时,HPA算法并不能马上做出扩容的反应;而本文方法能在负载上升之前扩容。在负载下降时,为了保证服务的QoS,将缩容的时机调整到负载下降之后。这里在扩缩容时是在不同物理服务器上进行,因此物理机负载变化影响较小。两种方法缩容时机相同,但是缩容的数量不同。因此基于ARIMA-XGBoost的方法比HPA的方法在负载变化的云环境更适合,每次都在负载上升之前做好了扩容的准备。

图4 HPA扩缩容过程

图5 ARIMA-XGBoost扩缩容过程

3.4 服务扩缩容响应时间和资源利用情况对比

为了验证基于本文的方法比HPA算法好, 采用服务扩缩容响应时间和资源利用率情况两个衡量指标。基于3.3节容器扩缩容的过程,记录下的服务响应时间对比如图6和图7所示,资源利用情况对比如图8所示。

图6 HPA方法扩缩容响应时间

图7 ARIMA-XGBoost方法扩缩容响应时间

图8 资源使用率对比

由图6和图7可以看到HPA算法在1~3 min时随着负载的增加,没能及时扩增容器数量,导致服务响应时间超出了200 ms(在云计算中服务的响应时间超过200 ms定义为服务质量低),而本文方法可以使服务的响应时间保持在200 ms以内。在15 min以后负载下降,两种方法都没有立刻缩容,因此服务响应时间均保持在200 ms以内。

由图8可以看出在0~25 min的扩缩容的过程中,在保证服务质量的情况下,本文方法比HPA算法扩缩容的数量少,因此资源的使用率比HPA方法低,因此资源的利用率比HPA算法高。

4 结 语

本文通过使用ARIMA时序预测方法得知服务负载将来的变化,然后根据预测的负载结合pod中CPU、内存的使用情况使用XGBoost算法预测需要扩缩的微服务/容器数量,对比kubernetes的HPA算法,本文方法能在保证服务质量QoS的同时降低系统资源的使用。

猜你喜欢

容器数量预测
无可预测
Different Containers不同的容器
选修2-2期中考试预测卷(A卷)
选修2-2期中考试预测卷(B卷)
难以置信的事情
统一数量再比较
不必预测未来,只需把握现在
头发的数量
取米
我国博物馆数量达4510家