基于Docker的Open Stack云平台卷存储模块的设计
2015-05-11吴哲夫邬新东WuZhefuWuXindongZhangTong
吴哲夫,邬新东,张 彤/Wu Zhefu,Wu Xindong,Zhang Tong
(浙江工业大学信息工程学院 杭州310023)
1 引言
近年来,随着科技的快速发展,尤其是网络技术的发展,云计算逐渐从概念变为现实。目前有4种主流的开源云平台管理软件[1]:OpenStack[2]、OpenNebula[3]、Eucalyptus[4]和 CloudStack[5]。 其 中 ,OpenStack凭借松耦合的系统架构、免费的商业模式及活跃的社区赢得了众多厂商的大力支持。在Havana版本中,OpenStack提供了对Docker[6]的支持。通过使用Nova-Docker项目,将OpenStack中用于构建虚拟机的Nova-Compute组件中的Hypervisor替换为Docker,以提供更轻量级、更高效的服务。但是Docker构建的容器并不支持OpenStack中的Cinder组件,基于此,本文设计了一个卷存储模块vol-manager,增加本地文件系统和Docker容器的映射功能,使本地卷存储能够直接挂载到容器中,以实现持久性存储。
2 基于Docker的OpenStack云平台的构建
2.1 OpenStack云平台整体部署架构
OpenStack采用模块化设计,松耦合的系统框架能集成老、旧、第三方的技术,从而满足业务需要,也使得开发者能够更容易地对OpenStack进行二次开发[7]。本文所要构建的云平台只需要使用以下几个组件。
认证服务:Keystone。Keystone为整个云平台提供统一的、完整的身份认证、服务目录、令牌、访问策略服务。
镜像服务:Glance。Glance为虚拟磁盘镜像提供目录和资源库,并保存镜像文件的元数据。
计算服务:Nova。Nova是整个OpenStack中最核心的组件,提供按需创建虚拟机的服务。
网络管理服务:Neutron。Neutron为Nova创建的各个虚拟机实例提供网络功能。
可视化组件:Horizon。Horizon为 OpenStack中的实例、服务提供图形化的界面。
其他组件:如Cinder、Swift等并不需要部署,详细信息可参见官方文档[8]。
具体的架构如图1所示。
2.2 Nova-Docker项目的部署
OpenStack云平台的默认虚拟化方案是KVM。在OpenStack Havana版本中,Nova-Docker作为插件被引入,以提供更轻量级的服务。之后为了加快整个项目的迭代开发,又将Nova-Docker作为孵化项目移出。在github上,适用于OpenStack Juno版本的Nova-Docker[9]已经相对成熟,可以提供较稳定的服务。Nova-Docker的架构如图2所示。
在整个云平台中,Docker作为一种新的Hypervisor,将取代默认的KVM。Docker创建的容器实例就是轻量级的虚拟机实例。Docker镜像通过Docker Save保存成TAR包,放置在Glance上管理。创建容器时,从Glance上下载容器镜像,利用Docker Load加载并启动容器镜像。
3 OpenStack构建虚拟机的流程
vol-manager模块依托于虚拟机实例的创建,掌握OpenStack构建虚拟机的整个流程对于模块的编写具有重要意义。在2.1节所介绍的组件中,Nova主要负责这一部分,它也是整个OpenStack中最核心的组件。从根本上来说,OpenStack中的其他组件都是为Nova服务。Nova由众多子服务组成,在构建虚拟机实例过程中,比较重要的是以下3个服务,见表1。创建虚拟机请求的处理流程如图3所示。
表1 Nova相关子服务
4 vol-manager模块的设计
4.1 整体架构设计
由于Docker并不支持Cinder共享存储,因此,Nova-Docker源代码中并没有在创建虚拟机的函数中增加存储功能。vol-manager的核心思想是通过配置文件中定义的相关参数,选择是否开启该模块,并在本地文件系统中创建目录,将该目录映射到Docker容器中,整体的架构如图4所示。
在spawn函数中,读取nova.conf配置文件中相关选项,判断是否开启卷模块,配置文件设置格式说明在4.2节。当确定模块开启时,调用_start_storage_container函数;当确定模块未开启时,调用_start_container函数。核心函数_start_storage_container的设计方案在4.3节。最后调用Docker本身的start方法创建容器实例。
4.2 配置文件的设定
由于OpenStack的配置文件采用分节的形式,本方案将vol-manager模块的配置单独作为一节添加到nova.conf中。
[vol-manager]
volume=true
container_dir=/data
local_dir=/mnt/docker_volume
volume选项决定是否开启卷服务:true为开启,false为关闭。local_dir为本地文件系统中卷目录地址,container_dir为映射到容器中的地址。
4.3 模块核心函数的设计
整个模块的核心函数为_start_storage_container函数,图5为该函数的设计流程。
函数首先要获取container_id,在编写代码过程中发现,在最新版本的Nova-Docker中,container_id可以作为一个参数直接传递给函数;在低版本的Nova-Docker中,需要调用_find_container_by_name函数来获取container_id。之后通过调用OpenStack的oslo.config库来读取nova.conf配置文件,来得到container_dir和local_dir,创建不存在的目录,并将两个参数绑定。传递给Docker类的start函数,等到容器创建完成,再为容器创建网络,并将网络附加到容器上。
在编写整个函数的过程中,要将相关步骤输出到日志中,这样有利于程序的编写及后期的调试。同时,需要对异常进行捕获,增强程序的顽健性。
以下为该核心函数中的关键源代码。
LOG.warning('_container_id__:%s'%container_id)
local_dir=self.get_localdir()
local_dir+=container_id.get('id','rand')
self.create_local_dir()
docker_dir=self.get_container_dir()
dir_param={local_dir:docker_dir}
self.docker.start(container_id,binds=dir_param)
if notnetwork_info:
return
try:
self.plug_vifs(instance,network_info)
self._attach_vifs(instance,network_info)
except Exception as e:
LOG.warning(('Cannot setup network:%s'),e,instance=instance,exc_info=True)
msg=_('Cannot setup network:{0}')
self.docker.kill(container_id)
self.docker.remove_container(container_id,force=True)
5 模块测试效果
由于OpenStack的版本更新速度较快,且每个版本之间可能会有较大的差异,因此,模块的设计在不同版本中可能会有所不同。本文所构建的云平台基于OpenStack Juno版本,具体主机配置见表2。
表2 主机配置
构建Ubunutu实例,分配浮动IP,如图6所示,其中的test4实例就是这次需要测试的实例。
进行功能性验证,具体的验证步骤如图7所示,图7为正向验证步骤,还可以反向验证,即在宿主机中创建文件,在test4实例中验证该文件是否存在。
实验结果表明:vol-manager模块能够有效解决容器实例中部分数据的持久性存储问题。同时,在容器与宿主机之间构建了通道,在宿主机上修改文件,能够实时映射到容器中。利用这种特性,将容器中部分软件的配置目录放在/data中,那么,在宿主机上就可以直接修改其中的文件,来改变容器中相关服务的特性。
以在test4实例中构建HTTP服务为例,说明vol-manager模块的作用。整个过程如图8所示。
在test4中,HTTP服务将/data目录作为网站的根目录。由于vol-manager模块将/data与宿主机中的local_dir关联在一起,因此,在宿主机的目录中建立网页文件,通过HTTP服务能够实时地访问。vol-manager模块不仅使容器中有关数据可以持久性存储,还为改变容器中某些服务属性提供了途径。
6 结束语
本文设计的vol-manager模块通过增加配置文件选项、修改驱动源代码实现了本地文件系统到Docker容器的映射,使容器中的数据能够保存到本地文件系统中。由于Nova-Docker项目正处于开发阶段,OpenStack对于Docker的支持并不完善,例如,不支持容器的迁移,这些都是未来的研究方向。
[1] 杨绍光,张云勇,陈清金等.基于OpenStack的云计算IaaS管理平台研究[J].互联网天地,2013,(3).
[2]SEFRAOUI O,AISSAOU M,ELEULDJ M.OpenStack:toward an open-source solution for cloud computing[J].International Journal of Computer Applications,2012,55(3):38-42.
[3]MILOJICIC D,LLORENTE I M,MONTERO R S.Opennebula:a cloud management tool[J].IEEE Internet Computing,2011,(2):11-14.
[4]NURMID,WOLSKIR,GRZEGORCZYK C,et al.The eucalyptus open-sourcecloud-computingsystem[A].9th IEEE,ACM International Symposium on Cluster Computing and the Grid[C].2009.
[5]KUMARR,JAINK,MAHARWALH,etal.Apache CloudStack:open source infrastructure as a service cloud computing platform[A].International Journal of Advancement in Engineering Technology,Management and Applied Science[C].2014.
[6]FINK J.Docker:a software as a service,operating system-level virtualization framework[J].Code4Lib Journal,2014,(25).
[7] 李小宁,李磊,金连文等.基于Open Stack构建私有云计算平台[J].电信科学,2012,28(9):1-8.
[8]OpenStack document[EB/OL].http://docs.openstack.org,2015.
[9]Nova-Docker[EB/OL].https://github.com/stackforge/nova-docker/tree/stable/juno,2015.