随着我国计算机技术的蓬勃发展,特别是近几年互联网+行业的兴起,人们对计算、存储、网络的要求也越来越高,面对越来越复杂多变的需求,传统的物理机-应用服务器方式越来越难于招架,私有云平台作为一个崭新的模式应运而生,并为IT 业的发展指明了方向。私有云平台具有高扩展性、高融合性、高灵活性、低成本等特点。如今,越来越多的主流企业已经采用OpenStack 云平台作为私有云的第一解决方案。
OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目。 OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。作为一个大型的开源项目,其项目重点在于对各种不同组件的广泛支持和对各种功能的扩展完善上,但这在生产环境下,特别是在某些极端条件下的性能表现就存在着一定的缺陷,需要我们后期去完善补全。
如果你对OpenStack较为熟悉,你就会知道OpenStack其实是一个非常庞大的系统,非常多的相互配合的服务(service)运行其中。因此,利用通用性能测试软件(Loadrunner,Jmeter等)进行性能测试发压,脚本编写量巨大,实施复杂度高。而OpenStack社区推出的rally测试引擎,具有更高的针对性和可用性。
Rally 是一个基准测试工具,可以帮助我们判断出OpenStack表现如何,特别是在有负载的场景中。你可以使用Rally的各种场景测试脚本来对你的OpenStack环境进行性能测试,基准测试,功能验证。
Deploy engine:可以与流行的部署器如DevStack、Fuel等结合使用,完成OpenStack测试环境部署或者独立完成已有测试环境注册的插件。
Verification:使用Tempset(OpenStack社区的接口自动化测试工具)来验证已部署的OpenStack云环境的功能性。
Benchmark engine:允许在云环境中制造并发负载,并进行基准测试。
在公司实际使用中,研发、测试、运维、销售都需要经常使用rally来获取性能参数,这就存在着以下几个问题急需解决:
针对以上问题,我们经过市场调研,确定Docker技术可以全面满足我们的需求。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何机器上。
特点:
应用场景:
可以看出docker可以全面满足我们的需求,但是同样也带来了新的问题:
那么针对以上问题,有没有一种简化方式,可以让使用者不用关心docker命令,不再执行重复的指令呢?答案是肯定的,这就是被我们称为docker持续交付系统的一套实现方法。
此系统主要包括2个方面:
Docker Image交付模块:此脚本为交付给用户使用的脚本,用户使用此脚本只需要了解基本的命令,就可以自动化的完成Docker环境的搭建,Rally环境的搭建、注册设置等操作;
Docker Image制作模块:此操作需要对Docker、Rally(应用系统)等熟悉的操作者,一般为应用服务的开发者或维护者;
此模块主要实现自动搭建rally环境,封装docker指令实现Docker透明化和环境卸载几个子模块。
自动搭建Rally环境
yum -y install docker #安装docker
docker login #登录docker
docker pull t2clouddocker/rally #下载image
docker run -i -t -d -p 33333:22 -v /home/rally_result/:/home/rally_result/ -v /home/rally_json/:/home/rally_json/ --privileged=true t2clouddocker/rally #启动容器
封装Docker指令
此操作是简化用户操作的重点,通过对docker命令的封装,使用户感觉不到docker容器的存在,进而直接在宿主机上执行容器内的rally指令,完成docker的透明化。创建rally.sh文件,用于在宿主机中操作docker中的rally程序。核心代码:
rally="#!/bin/bash \n \
[ \"\$*\"x = x -o \"\$1\"x = \"help\"x ] && { echo \"******************使用说明*******************\"; \n \
echo \"all :运行所有场景(python /home/rally_json/run_rally.py)\"; \n \
echo \"bash :运行bash命令\"; \n \
echo \"backup:备份rally数据库到rally_result路径\"; \n \
echo \"help :显示帮助信息\"; \n \
echo \"其他 :执行rally命令\"; exit; } \n \
[ \"\$1\"x = \"all\"x ] && { docker exec -i $ids python /home/rally_json/run_rally.py;exit; } \n \
[ \"\$1\"x = \"bash\"x ] && { docker exec -i $ids \$2;exit; } \n \
[ \"\$1\"x = \"backup\"x ] && { docker exec -i $ids cp /var/lib/rally/database/rally.sqlite /home/rally_result/;exit; } \n \
docker exec -i $ids rally \$*"
创建的rally.sh会通过软连接(ln -s)为rally,这样在宿主机执行rally命令,实际上是调用rally.sh脚本,通过rally.sh脚本完成了指令从宿主机到Docker Container的穿透。使用户忽略了docker的存在,做到“就像是在本机运行rally一样”。
环境卸载
此子模块实现了rally环境的卸载,包括:备份rally数据库、删除Docker Container、删除Docker image、删除rally.sh脚本等
模块主要实现自动安装docker环境、自动拉取最新代码、自动生成Docker Image,并把制作的image上传到Docker Hub中。代码核心:
yum -y install git docker #安装工具
git clone git://git.openstack.org/openstack/rally #拉取代码
docker build -t DockerHubId/rally:x . #生成image
docker push DockerHubId/rally:x #上传镜像到Hub
其实,以上整个流程,不仅仅是Rally性能测试应用程序的交付系统,也同样是Docker实际应用的经典场景的自动化实现。我们可以按照此设计思路稍加修改,就可以实现接口自动化测试的自动交付系统、存储系统的性能测试自动交付系统、演示环境的自动交付系统等等。
通过对Docker命令的封装,使用户既享受到Docker带来的便利,又可以忽略Docker操作上的不便,使Docker透明化。
作者简介:聂锟,高级性能测试架构师,在金融、互联网、游戏,云计算等行业深耕十一载,积累了丰富的接口,网络,存储,数据库性能测试实战经验。目前就职于云途腾科技有限责任公司,负责OpenStack相关性能测试和社区rally项目的贡献。