一种适用于Docker Swarm集群的调度策略和算法

2017-06-29 12:00:35马晓光刘钊远
计算机应用与软件 2017年5期
关键词:静态容器集群

马晓光 刘钊远

(西安邮电大学计算机学院 陕西 西安 710061)

一种适用于Docker Swarm集群的调度策略和算法

马晓光 刘钊远

(西安邮电大学计算机学院 陕西 西安 710061)

Swarm是基于Docker容器的集群管理工具。通过分析研究Swarm整体架构和调度策略,针对集群的资源碎片问题和负载均衡问题,提出一种静态平衡和动态预测相结合的容器调度算法。通过测试,该算法能够减少集群的静态资源碎片,提高集群资源的利用率,并能维持集群的负载均衡。

云计算 资源碎片 负载均衡 Docker容器 Swarm

0 引 言

Docker[1-4]自开源以来,就受到了广泛的关注和讨论,由于众多新颖的特性以及项目本身的开放性,Docker迅速获得包括Google、Microsoft、VMware等业界行业领导者的青睐,并对其提供支持。Docker公司随之迎来了巨大的发展机遇,并在2014年12月发布了原生态容器集群管理工具Swarm。Swarm基于Go语言进行开发,用于管理Docker集群,使Docker集群对于用户而言当于一个虚拟的整体。

Docker在云生态中占有重要地位, Swarm在云架构PaaS(平台及服务)/IaaS(基础设施及服务)层中也占有重要地位。Swarm主要完成的工作是:根据调度策略将容器运行在合适的节点上,由于节点上运行容器的不同,其资源利用率也有所差别。而每个节点的资源利用率又决定了整个集群的负载情况。因此,集群调度策略的优略就显得尤为重要。

不同的容器需求不同维度的资源,当一个节点任意维度的资源耗尽时,如果有多维资源需求的容器被启动,那么该节点将不能满足创建容器的需求,也就不能运行此容器。在这种情况下,其他维度的剩余资源就被闲置了下来,而这些未被利用的资源就称为资源碎片[5-6],这是一种极大的浪费。所以,就需要减少资源碎片的大小。同时,集群整体负载的均衡情况决定了集群在服务时的整体表现,为了提高集群的服务质量,需要保证整个集群的负载均衡。

本文分析研究了Swarm的整体架构和调度策略,提出一种静态平衡和动态预测相结合的容器调度算法。通过测试,本算法能够减少节点的静态资源碎片,维持整个集群的负载均衡。

1 Swarm集群框架与调度策略

1.1 Swarm架构

Swarm采用了C/S架构,Swarm主要架构如图1所示。

图1 Swarm架构

Docekr Client是客户端,负责发送指令,Swarm master是服务器端,负责管理整个集群。Swarm集群分为Swarm Node和Docker Node。

Swarm master运行在Swarm node上,主要工作是完成调度任务和管理集群。用户通过Swarm Client初始化集群各个模块并管理集群,discovery模块负责发现集群的节点并收集信息,scheduler模块负责容器请求的调度任务,Cluster API定义了集群接口,是实际任务的完成者,leadship是Swarm的HA(高可用性)机制。

Docker Node是指运行Docker Daemon的节点。Docker Daemon根据Swarm master的任务启动相应容器。Docker Node通过Swarm Agent向管理节点注册信息,以便管理节点在执行任务的时候可以发现该节点。

1.2 Swarm调度策略及资源碎片问题

Swarm的scheduler模块分为filter组件和strategy组件。filter组件通过标签对节点进行过滤。用户在创建集群时,需要根据节点的不同功能给与节点不同的标签,用户一旦启动容器,scheduler会根据用户提供的标签,过滤出匹配标签的节点集合供strategy组件处理。

strategy组件对集群提供逻辑调度功能。主要有以下三种策略:spread、binpack和random。用户选择的策略将会决定集群如何计算节点的权重,集群默认使用spread策略。其中random策略用来对程序进行测试,仅对节点进行随机选择;spread和binpack策略首先计算节点的权重,然后选择合适的节点运行容器。

节点权重的计算策略为:首先根据用户申请的容器配制信息计算CPU和内存的利用率,并将其结果求和,随后,spread策略会优先选择权重小的节点运行容器,而binpack会优先选择权重大的节点运行容器。前者的优点是,如果节点出现故障,将会损失少量的容器。后者的优点是将更多的容器运行在较少的机器上,节省物理资源。

尽管swarm调度策略简单而有效,但是其忽略了一个重要问题,资源碎片问题。由于不同的容器需求不同维度的资源,当一个节点的任意维度资源耗尽时,如果有多维资源需求的容器被启动,那么该节点将不能满足创建容器的需求,也就不能运行此容器。在这种情况下,其他维度的剩余资源就被闲置了下来,而这些未被利用的资源就被称为资源碎片,这是一种极大的浪费。所以就需要减少资源碎片的大小来提高节点的资源利用率。

同时Swarm在计算节点优先级时,由于计算方法的简单,随着集群的规模的扩大,就会产生相同优先级的节点。现有的容器调度策略只是对相同优先级的节点进行了随机的分配,并没有对相同优先级节点进行再次比较,但是,容器在运行时是动态地申请节点上的资源,这会造成在实际运行环境中,集群负载的不均衡。由于集群整体负载的均衡情况决定了集群在服务时的整体表现,相同优先级节点的资源负载并不相同,因此,用户体验也不相同,这就降低了集群提供服务的质量。

2 Swarm调度策略的优化

根据上述情况,本文提出了静态资源平衡和动态资源预测的策略对Swarm调度策略进行优化。

2.1 静态资源平衡策略

多维资源的存在引发了资源碎片的问题。由1.2节可知,在一个满负载的节点上,资源碎片显然存在,节点资源分配是否平衡则关系到资源碎片的大小。为了减小资源碎片,需要改进Swarm现有调度策略,在集群分配容器时,需要度量容器分配后多维资源的平衡情况,从而选择平衡情况最好的节点启动容器。

2.2 动态资源调度策略

虽然静态资源平衡策略考虑了静态资源碎片的问题。但是,并没有考虑资源动态的变化问题,容易造成集群负载不均的情况。因此,根据这种情况,需要在静态平衡策略的基础上增加动态调度策略作为补充。分析Swarm整体架构,其中并没有提供动态收集节点信息的模块,这就需要增加此模块实现动态资源调度策略,修改后Swarm框架如图2所示。

图2 动态资源调度框架

首先在Swarm中添加receiver模块,供scheduler模块调用,receiver模块用来接收monitor模块传输的节点实时预测信息。monitor模块运行在每个节点上,实时监控节点多维资源的使用情况。由于每个节点资源使用情况会随着时间产生不同的波动。仅仅提供当前节点信息并不能代表节点资源的实际使用情况。所以需要研究监控节点的变化趋势和时间关系,可以有效地预测出未来节点的资源使用情况,完成调度功能。

3 算法的设计与实现

3.1 优化调度算法的设计流程

总结上述策略,本文提出静态动态相结合和的优化调度算法,该算法流程如图3所示。

图3 优化调度算法流程

(1) scheduler模块获取申请容器的配制信息。

(2) 静态资源平衡算法计算静态权值。

(3) receiver模块获取monitor模块动态预测的节点的信息。

(4) scheduler模块获取receiver模块的节点信息,计算动态权值。

(5) scheduler模块根据静态权值对节点排序。

(6) scheduler模块对静态权值相等的节点根据动态权值进行二次排序。

(7) scheduler模块选择权值最小的节点分配容器。

3.2 静态资源平衡算法

这里通过计算CPU资源和内存资源之间的方差来度量节点资源的平衡情况。因为方差度量了一组数据的离散程度。方差越小代表这组数据越稳定,反之,则越不稳定。

静态资源平衡算法如下:

设节点的资源维度为D[1,2,…,d],节点已分配的资源为U[u1,u2…,ud],节点的资源总量为T[t1,t2,…,td],节点即将分配的资源为P[p1,p2,…,pd],节点的资源利用率R[r1,r2,…,rd]。

当用户向集群申请一个容器。首先集群调度模块获取容器的配制信息,使用式(1)计算出每个节点在分配此容器后的静态资源利用率。

(1)

然后使用式(2)计算每个节点的平均资源利用率:

(2)

最后使用式(3)计算每个节点的CPU资源和内存资源的方差S2,方差即为节点的静态权值:

(3)

3.3 动态资源调度算法

1) 预测模型的选取

在选取预测算法时,需要考虑预测模型是否能够反映节点负载的真实情况,同时又要求算法应具有较小的时间复杂度[7]。由于Swarm是基于Docker的原生态集群,其Docker轻量级和便携性的优势在Swarm中体现的非常突出。通过综合考量,应该避免使用时间复杂度高的高次曲线对节点负载情况进行模拟,以免过度消耗集群的整体资源,削弱Swarm集群的整体表现。基于上述原因,本文采用灰色模型GM(1,1)[8-9]对节点的状态变化进行模拟预测。

灰色系统理论是邓聚龙在1982年创立的一门新兴横断学科,它以“部分信息已知,部分信息未知”的“小样本”、“贫信息”不确定性系统为研究对象,主要通过对部分已知信息的生成、开发,提取有价值的信息,实现对系统运行规律的正确认识和确切描述,并据以进行科学预测。其主要优点包括以下几点:需求样本量小,样本不需要有规律性分布,计算工作量小,定量分析结果与定性分析结果一致,预测准确度高。

2) 基于灰色模型的节点负载预测

由于Swarm原有调度策略中只计算了CPU和内存两个维度的资源,因此这里假设节点的CPU利用率为Uc,内存利用率为Um。首先通过monitor获得节点的前n时刻的Uc={Uc(1),Uc(2),…,Uc(n)}和Um={Um(1),Um(2),…,Um(n)}后,采用GM(1,1)预测算法模拟,然后对n+1时刻的Uc和Um值进行预测。计算方法如下:

步骤1 设时间序列x(0)={x(0)(1),x(0)(2),…,x(0)(n)}有n个原始值,使用式(4)通过一次累加生成新的序列x(1)={x(1)(1),x(1)(2),…,x(1)(n)}:

(4)

根据灰色预测方法,得出GM(1,1)模型相应的微分方程为式(5):

(5)

其中,α称为发展灰数;μ称为内生成控制灰数。

(6)

(7)

Y=(x(0)(2),x(0)(3),…,x0(n))T

(8)

步骤3 求解微分方程,根据式(9)即可得预测模型:

(9)

步骤4 根据式(10)对预测模型值累减,得到预测值:

(10)

步骤5 精度检验,根据式(11)计算原始数据和预测数据的相对残差:

(11)

3) 基于灰色模型的动态资源调度算法

步骤1 获得当前的CPU和内存利用率的时间序列x(0),并根据式(4)对其进行一次累加计算,得到一次处理的数据序列x(1)。

步骤2 根据B和Y的计算公式(式(7)和式(8)),形成B矩阵和Y矩阵。

步骤3 对B和Y矩阵进行矩阵运算,根据式(6)求出发展灰数α和内生控制灰数μ。

步骤6 根据式(11)对预测模型进行残差检验,评估模型是否达到要求。

步骤7 对n+1时间节点的CPU和内存预测值求和得出节点的动态权值。

4 实验设计及结果分析

本实验搭建2个Swarm集群,集群1使用Swarm1.0.1搭建,集群2使用修改后的Swarm1.01源码包重新编译并搭建。每个集群由3台普通PC组成。其组成如表1所示。

表1 集群配制

由于实验条件限制,现设计实验如下:

实验一 对两个Swarm集群申请如表2序列容器。集群1算法为Swarm原算法,集群2算法为静态资源平衡算法。每个集群容器的运行情况如表3所示。

表2 容器申请序列

表3 容器运行对比结果

图4 集群资源碎片对比图

由图4可知,集群2中的静态资源碎片相比集群1有明显下降,由表3可知,集群2相比集群1可以多运行一个维度为[1,2]的容器。改进算法能够减少静态资源碎片,增加资源的利用率。

实验二 为方便计算,本文定义动态资源度量单位S=(Uc+Um)×100。每个节点的初始状态如表4所示。

表4 节点初始状态

本实验通过在集群2上增加动态预测算法和静态资源平衡算法作比较,表5为每个节点的运行容器的情况。本文通过模拟程序给予node1中单核满负载,其他节点为初始状态。同时,给予容器1、3和5号容器CPU满载,2号容器CPU满载并使用1GB的内存,容器运行情况如表5所示。

表5 容器运行对比结果

集群负载对比情况如图5所示。由图5可知,静态平衡算法会出现集群整体负载不均衡的情况,增加动态预测算法后,集群整体负载相对均衡。

图5 集群负载均衡对比图

总结上述实验,优化调度算法不仅可以减少集群的静态资源碎片,提高资源利用率,而且可以均衡集群的动态负载。

5 结 语

Docker容器随着其生态圈的完善,越来越受到大家的青睐。Swarm作为Docker的原生态集群管理工具也显得更加重要。本文在分析Swarm集群框架和调度策略的基础上,针对原有调度策略在解决静态资源碎片问题上存在的不足,提出静态平衡算法,并在此基础上增加动态预测算法均衡集群的动态负载。实验表明,优化调度算法能改善集群资源碎片过多的问题,提高资源利用率,同时能够均衡集群的动态负载。

[1] 杨保华,戴王剑,曹亚仑.Docker技术入门与实战[M].北京:机械工业出版社,2015.

[2] 孙宏亮.Docker源码分析[M].北京:机械工业出版社,2015.

[3]LiuD,ZhaoL.Theresearchandimplementationofcloudcomputingplatformbasedondocker[C]//2014 11thInternationalComputerConferenceonWaveletActiveMediaTechnologyandInformationProcessing,2014:475-478.

[4]BernsteinD.Containersandcloud:fromLXCtoDockertoKubernetes[J].IEEECloudComputing,2014,1(3):81-84.

[5]HuangW,LiX,QianZ.Anenergyefficientvirtualmachineplacementalgorithmwithbalancedresourceutilization[C]//2013SeventhInternationalConferenceonInnovativeMobileandInternetServicesinUbiquitousComputing(IMIS),2013:313-319.

[6]TsengHW,WuRY,ChangTS.AneffectiveVMmigrationschemeforreducingresourcefragmentsinclouddatacenters[C]//Proceedingsofthe2014ConferenceonResearchinAdaptiveandConvergentSystems,2014:320-325.

[7] 李丹程,王晓晨,宋晓雪,等.基于OpenStack的资源负载预测方法研究[J].计算机应用研究,2014,31(7):2178-2182.

[8] 段峰,杨芬.灰色预测模型的研究及应用[J].湘南学院学报,2008,29(2):17-21.

[9] 郭正红,马辛华,兰安怡.基于层次分析法权重和灰色服务器负载预测的云计算on-line迁移策略[J].计算机测量与控制,2015,23(3):1002-1004,1007.

A SCHEDULING STRATEGY AND ALGORITHM FOR DOCKER SWARM CLUSTER

Ma Xiaoguang Liu Zhaoyuan

(SchoolofComputerScience,Xi’anUniversityofPostsandTelecommunications,Xi’an710061,Shaanxi,China)

Swarm is a cluster management tool based on the Docker container. Aiming at the problem of resource fragment and load balancing of cluster, container scheduling algorithm combining static balance and dynamic prediction is proposed by analyzing the overall structure and scheduling strategy of Swarm. Through testing, the algorithm can reduce the static resource fragment of the cluster, improve the utilization rate of the cluster resource, and maintain the cluster load balance.

Cloud computing Resource fragment Load balancing Docker container Swarm

2016-05-18。马晓光,硕士生,主研领域:计算机技术。刘钊远,教授。

TP338.8

A

10.3969/j.issn.1000-386x.2017.05.049

猜你喜欢
静态容器集群
Different Containers不同的容器
静态随机存储器在轨自检算法
难以置信的事情
海上小型无人机集群的反制装备需求与应对之策研究
一种无人机集群发射回收装置的控制系统设计
电子制作(2018年11期)2018-08-04 03:25:40
Python与Spark集群在收费数据分析中的应用
勤快又呆萌的集群机器人
取米
机床静态及动态分析
机电信息(2015年9期)2015-02-27 15:55:56
具7μA静态电流的2A、70V SEPIC/升压型DC/DC转换器