容器调度策略及通信技术研究

容器调度策略及通信技术研究

摘要:随着云计算技术在各行业的深入应用,服务器资源的快速部署成为一种必需的要求。目前服务器集群的并发量及伸缩性是瓶颈,低负载会导致服务器资源的浪费,而高负载又会影响用户的访问质量。以Docker为代表的容器技术实现了轻量级的虚拟化,提高了各种资源的使用效率和隔离方式。然而,对于大规模的容器集群,如何高效地进行任务调度,提高通信效率以及通信的安全性,是目前讨论的焦点。对容器技术中的任务调度及通信技术进行研究,并分析对应的优化策略,有重要的现实意义。

关键词:容器;调度策略;通信;优化

0引言

云计算技术目前已经在各行各业得到广泛应用,虚拟化技术是云计算的基础,能够把物理资源映射为虚拟资源,从而在最大程度上提高了物理资源的利用率。传统的虚拟化技术在创建及销毁实例的过程中,都需要很大的资源和时间开销;最重要的是,如果要大规模的部署使用,随着服务器数量的增加,传统虚拟化技术的缺陷会被进一步放大。Docker容器技术是一种全新的基于LinuxContainer容器引擎的轻量级虚拟化技术,能够实现应用的高效部署,同时保证资源的隔离。

1Docker及容器技术

Unix系统下的chroot是最早的容器技术,目的是把root用户的资源转移到其他位置,并仅仅允许指定进程访问,从而实现不同进程的隔离。后来又先后出现了LXC容器技术、Docker容器技术等。Docker容器技术是dotCloud公司的开源项目,其中包含仓库、镜像模型、命令行工具以及RESTAPI工具等和容器管理关联的生态系统。在Docker了正式版本后,RedHat也提供了对Docker的支持,随后谷歌、亚马逊、微软等也先后宣布支持。谷歌于2015年首次公开了Kubernetes,将之作为Docker容器的编排工具。国内的腾讯、京东等公司先后在生产系统中使用Docker容器技术。Docker容器技术的隔离是通过完全沙箱的方式实现的,因此即使两个容器运行在同一宿主机上,也不会有直接访问的接口,从而保证了资源的独立访问。另外,容器和宿主机间共享内核资源,从而降低了资源运行时需要的开销。

2容器技术中的调度策略

虽然Docker在应用的分发、部署等方面具有巨大的优势,然而随着Docker在服务器集群上的应用范围逐渐扩大,如何提高Docker集群中任务调度的效率、最大化集群资源的利用率已经是一个重要的现实问题。另外,Docker容器中的网络应用也越来越多,从而对Docker的网络通信技术提出越来越高的要求。这样一来,如何保证部署不同应用的Docker容器间的通信质量,也成为一个巨大的挑战。

2.1容器集群

随着部署在Docker容器中的应用越来越多,容器的规模也不断增加,仅仅在单个宿主机上构建容器无疑会导致瓶颈,因此使用Docker集群就成为理所当然的事情。Docker集群对外是一个单一的服务实体,由多个相互独立的服务器个体组成。集群一般有两大特性[1]:(1)负载均衡。用户请求或数据会根据一定的均衡原则分摊到集群中的多个实体上执行,从而可以按照不同服务器的实际处理能力分配相称的任务;在充分利用集群内各种资源的基础上,最小化任务的执行时间,同时提升集群的处理能力。(2)故障恢复。如果集群中的服务器因为资源短缺或故障原因无法继续执行任务,则需要从集群中选择合适的节点继续执行。Docker集群中的所有节点都部署了Docker服务,各节点上的物理资源分配给需要的Docker容器使用。和传统集群不同的是,Docker集群除了包含物理节点外,还包括各物理节点上的Docker容器;这种多层次的Docker容器集群在实现负载均衡和故障恢复时,就不能简单的应用传统集群的调度策略,需要一种合理而又高效的调度策略完成Docker容器集群的任务调度工作。目前在部署并管理Docker容器集群时,已经有集中使用广泛的工具,主要包括[2]:(1)Kubernetes。谷歌在多年Docker容器开发经验的基础上,为Docker集群提供的资源调度、负载均衡套件。虽然Kubernetes提高了Docker集群的管理能力,但由于其学习成本较高,因此并没有被推广到多数应用Docker的场合。(2)Swarm。Docker官方提供的集群工具,具备资源调度、负载均衡以及服务发现的能力,不需要额外的学习成本,因此应用范围比较广。然而,Swarm的负载均衡策略比较简单,并且其故障恢复功能不佳。和Kubernetes相比的优势在于不需要针对Docker做定制化的修改。(3)Mesos。Apache旗下的比较成熟的分布式管理框架,其分布式容错特性能够解决多数分布式集群调度问题。需要注意的是,Mesos应用于Docker集群时需要对Docker进行定制化修改,无疑提高了使用成本。

2.2容器集群的调度策略及其优化

其中Swarm为Docker客户端提供API,从而保证Swarm集群中运行容器能像单个宿主机上运行容器那样执行同样的命令,以便借助Swarm集群进行任务调度。在客户端请求Request发送到DockerSwarm时,Swarm会判断请求中是否有限定条件,如果有则借助FilterChain模块筛选出符合条件的节点,随之根据既定策略把所有筛选出的节点排序,并选择排名最高的节点作为调度执行节点。Swarm集群的调度策略主要包括3种[3]:随机调度策略、密集型调度策略以及扩散型调度策略。顾名思义,随机型调度策略会随机选择调度节点,实际应用中通常用作任务调度策略的调试,以便检验Swarm集群的连通性。密集型策略会根据不同集群节点的内存、CPU资源计算各节点的权重,在任务调度请求到达时会尽量将任务集中部署到一个节点上,当此节点无法再继续接受任务时再选择其他节点调度。扩散型策略在有调度请求时,会把每个调度请求均匀地分配到每个节点,以确保最大化利用每个节点的资源使用率。密集型调度策略以及扩散型调度策略在进行任务调度时,本质上都是利用集群中各节点的内存及CPU资源进行动态加权负载均衡,并没有考虑各节点的网络带宽资源。可以以此为切入点对任务调度策略进行优化:计算各节点流入/流程网卡上的双向流量占最大数据处理能力的比重,以此衡量单位时间内不同节点网络资源的权重。在解决了容器集群负载均衡没有考虑网络资源的前提下,为了克服各资源的权重设置不合理的问题,可以为每种资源的权重引入一个二次调节因子,进而根据集群节点实时的负载情况动态调整权重。

3容器技术中的通信技术

3.1Docker容器的通信技术

容器的一大特性就是其资源隔离性,Docker容器借助NetworkNamespace实现了网络设备、IP路由表等各种网络资源的隔离。Docker容器自身并没有网络设备,在需要进行网络通信时借助虚拟网桥以及Vethpair实现网络虚拟化。Docker支持4种网络模式[4]:(1)bridge模式。在bridge模式中,DockerDaemon创建一个网桥,并在创建容器时创建一组vethpair网络设备对,用于容器和Docker宿主机的网络通信;虽然实现了容器间的连通及隔离性,但是宿主机及容器间的网络地址不在同一网段,即使NAT映射能够实现宿主机和容器间的网络传输,但在网络负载时这种单一的方式会成为网络及性能瓶颈。(2)host模式。容器中不创建与宿主机隔离的网络环境,而是与宿主机共用各种网络资源,可以直接与容器外部通信。(3)container模式。和已存在的容器共享网络资源,但其他系统资源还是隔离的。(4)None模式。容器不进行任何网络配置,用户可以根据需求定制网络。以上的网络通信模式都存在各自的弊端,加之随着Docker容器技术在云端的应用不断增加,需要的网络服务类型也更加多样化,因此需要日益复杂的网络设置,需要有完善的网络Qos功能的支持,然而目前的Docker通信模块中并不支持。为克服Docker容器在网络通信上的不足之处,通常使用第三方工具来定制网络通信方式,常用的网络通信定制工具有[5]:(1)OpenvSwitch(OVS)。可以实现容器间的通信,并且其内置的Qos模块可以很好的对网络服务进行质量控制;然而,OVS是重量级的工具,不适合中小应用。(2)Flannel。虽然能够为容器集群中的所有节点重新规划并分配IP,但是部署相对复杂,大规模的集群节点会增加配置部署的复杂度;更重要的是并没有Qos服务质量控制。(3)Linux系统内置的流量控制以及Cgroups。虽然具备Qos服务质量控制功能,但是创建容器时需要指定固定的大小,难以实现动态网络控制,而且需要修改内核,扩展性相对较差。从上述分析可知,目前容器通信技术存在一定缺陷,各解决方案大多是针对特定应用场景,如果想要为容器提供完善的通信模式还需要进一步优化。

3.2Docker容器的通信优化

原生的Docker容器中对网络通信资源的管理粒度较粗,为细化管理粒度,可以根据通信资源使用不同优先级的队列,并进行自适应带宽控制。实现方式是[6]:(1)指定容器的优先级。创建容器的时候,根据容器中运行应用的优先程度将其划分为不同程度的优先级,高优先级的容器优,先被分配网络资源。(2)创建优先级队列。初始化时为每一优先级创建对应的队列,以缓冲各自优先级的网络流量。容器中应用发出的网络流量会先缓存在对应优先级队列中。(3)网络流量处理。根据优先级依次处理各队列中的网络数据包,根据实际需要进行网络地址转换或数据转发。通过上述优化,能够保证关键服务使用较大的网络带宽,以此缩短其响应时间。另外,普通的应用也不会因为一直有关键服务运行而长时间饥饿等待,即使在业务规模大的时候,也能够根据自适应调整获取适当的通信资源。最重要的是还能够根据实时的网络资源使用情况动态调整资源的分配,提高通信性能。

4结语

本文对容器技术中的任务调度及通信技术进行研究,并分析对应的优化策略。在任务调度优化策略中,在进行动态加权负载均衡时增加了各节点的网络带宽资源因子,并为每种资源的权重引入一个二次调节因子,进而根据集群节点实时的负载情况动态调整权重。细化了网络通信资源的管理粒度,方便容器中的应用根据网络情况动态调整通信资源。

作者:杨林 单位:国网河南省电力公司焦作供电公司