zoukankan      html  css  js  c++  java
  • 如何使用Rally+Docker测试OpenStack


    http://geek.csdn.net/news/detail/67842


    一.为什么要用Rally Docker

    1.为什么要通过Docker使用Rally

    众所周知,软件产品部署环境的变化(譬如,从A环境到B环境等),会导致测试环境响应的变化。那么,有没有一种办法,可以更好的解决这种环境迁移导致的诸多问题。即让测试环境更加自主、可控和轻量。

    Docker时代的来临,无疑,为我们提供了一把新的钥匙。

    通常,为了构建这样的一个测试平台,即便是熟练者往往也需要花费30分钟以上的时间。通过使用Docker容器化,将Rally独立于宿主机OS,而单独运行在容器中,可以做到系统隔离,平台复用和分布式测试等高效用途。

    社区对OpenStack的集成测试工具采用Tempest,性能测试采用Rally。众所周知,性能测试一般是在一个软件产品在某个迭代内开发完毕,上线部署之前执行。

    作为OpenStack测试领域内的急先锋,Rally当然也不例外。典型的应用场景:一是对内部基于OpenStack开发的产品做性能测试;二是做服务实施时,给客户做的POC以及上线之前的性能测试等。需要尤为注意的是,由于性能测试依赖于硬件物理资源配置,所以应当根据实际情况出发,甄别出不同环境下的性能测试差异。

    2.什么是Rally

    Rally 常用于模拟高并发场景的压力测试。比如OpenStack API在并发下的响应时间和请求成功率,从而测试出OpenStack的规模和性能。Rally特性如下:

    • Rally 会自动部署一个OpenStack的环境, 并运行tempest来验证环境;
    • Rally会模拟生成用户负载,以提供性能测试问题;
    • Rally通过Ceilomter来收集 Hypervisor 和VM的数据,并放在Rally的数据库中;
    • Rally 最终会生成可读性极佳的性能测试报告;

    图片描述

    • Deploy engine:并不是一个OpenStack的部署器(deployer),而是一个类似于插件的结构(pluggable mechanism),可以很好的与流行的部署器如DevStack、Fuel等结合使用;
    • Verification:使用Tempset来验证已部署的OpenStack云环境的功能性;
    • Benchmark engine:允许在云环境中制造并发负载,进行压力测试;

    目前,有如下一些公司但不限于在社区贡献Rally:

    图片描述

    使用Rally的三个高水平案例

    图片描述

    从上图可以知道,Rally典型的作用有:

    • 自动化测试和分析,了解新并入的代码对OpenStack的影响;
    • 使用Rally profiler来检测性能问题;
    • 测试不同部署方式对于操作系统性能的影响;
    • 创建针对不同规模的负载压力;
    • 检测不同负载下,基本云主机操作的性能情况;
    • 测试涉及到OpenStack的几乎所有使用场景;
    • 最核心的是,Rally可以是QA测试、DevOps、CI/CD中不可或缺的重要组成部分;

    二.安装和使用Docker

    备注:
    这里,我的操作环境是Rally docker和由DevStack安装的OpenStack环境均构建在同一个CentOS 7虚拟机中。

    1)Docker软件包已经包含在默认的CentOS-Extras软件源里,安装命令如下:

    # yum -y install epel-release
    # yum install docker -y
    

    2)当Docker安装完成之后,你需要启动docker进程:

    # systemctl restart docker

    3)如果我们希望Docker默认开机启动,如下操作:

    # systemctl enable docker

    4)配置Docker加速器。这里我们使用daocloud提供的docker镜像加速服务:

    #sed -i 's|other_args="|other_args="--registry-mirror=http://768e1313.m.daocloud.io |g' /etc/sysconfig/docker
    
    #sed -i "s|OPTIONS='|OPTIONS='--registry-mirror=http://768e1313.m.daocloud.io |g" /etc/sysconfig/docker
    
    #sed -i 'N;s|[Service]
    |[Service]
    EnvironmentFile=-/etc/sysconfig/docker
    |g' /usr/lib/systemd/system/docker.service
    
    # sed -i 's|fd://|fd:// $other_args |g' /usr/lib/systemd/system/docker.service
    

    5)重启服务:

    # systemctl daemon-reload
    # systemctl restart docker

    6)现在,我们来验证 Docker 是否正常工作以及为下一步安装Rally做足准备。为此,我们需要下载centos 7镜像。

    # docker pull centos:7

    7)下一步,我们运行下边的命令来查看镜像,确认镜像是否存在:

    # docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED                  VIRTUAL SIZE
    docker.io/centos    7                   eeb3a076a0be        Less than a second ago   196.7 MB
    

    OK,事已至此,Docker和CentOS7镜像现在已经build好了。我们继续进行下一步。

    三.安装和使用Rally

    1.安装和使用Rally

    1)首先,我们需要进入到CentOS 7这个Docker镜像中,执行安装和配置任务等。

    # docker run -i -t centos:7 /bin/bash

    2)安装相关的依赖关系

    # yum -y install epel-release
    # yum install gcc-c++ python-pip git which

    3)下载和安装Rally

    # cd /home
    # git clone https://github.com/openstack/rally.git
    #cd rally
    #./install_rally.sh
    ==============================
    Installation of Rally is done!
    ==============================

    Rally is now installed in your system. Information about your Rally
    installation:

    • Method: system
    • Database at: /var/lib/rally/database
    • Configuration file at: /etc/rally
    • Samples at: /usr/share/rally/samples

    小贴士
    如果,你在执行如下步骤时报错了,请设置系统时间:

    # git clone https://github.com/openstack/rally.git
    Cloning into 'rally'...
    fatal: unable to access 'https://github.com/stackforge/rally.git/': Peer's Certificate has expired.

    解决:

    [root@0e1be457a0f3 home]# exit     //退出docker
    exit
    # yum -y install ntp
    # timedatectl set-timezone Asia/Shanghai 
    # timedatectl
    # timedatectl set-ntp yes
    # date
    Wed Apr  6 22:53:41 CST 2016

    之后,再次进入docker镜像,进行其他操作。

    4)配置Rally

    切换到rally/samples/deployments目录下,编辑一个名为existing.json的文件。
    这个文件用来干嘛的呢,是用来与openstack环境互通的。如下所示。

    # cat existing.json
    {
        "type": "ExistingCloud",
        "auth_url": "http://10.10.10.129:5000/v2.0/",     // keystone endpoint
        "region_name": "RegionOne",
        "endpoint_type": "public",
        "admin": {
            "username": "admin",                    //管理员用户
            "password": "admin",                    //管理员用户密码
            "tenant_name": "demo"                  //一个测试用的租户
        },
        "https_insecure": false,
        "https_cacert": ""
    }
    

    5)生效

    # rally deployment create --file=existing.json --name=docker_rally

    图片描述

    6)验证Rally是否安装成功以及连通OpenStack环境

    # rally show flavors
    # source ~/.rally/openrc
    # glance image-list

    图片描述

    7)检查OpenStack的部署环境

    # rally deployment check

    图片描述

    OK,到了这里都没有问题,现在我们可以继续往下进行OpenStack压力测试了。目前,Rally支持的OpenStack压力测试项目,如图所示:

    图片描述

    8)执行Rally测试

    Rally的测试用例文件,一共有json和yaml两种格式文件,同名称的文件,其测试用例内容都是一样的。这里,我们测试的对象是Keystone服务的create-user测试用例。如下所示:

    # cat create-user.json
    {
        "KeystoneBasic.create_user": [
            {
                "args": {},
                "runner": {
                    "type": "constant",
                    "times": 100,           // 测试执行次数
                    "concurrency": 10       // 并发数
                }
            }
        ]
    }
    
    # pwd
    /home/rally/samples/tasks/scenarios/keystone
    # rally  -v task start create-user.json
    

    通过,观察测试结果信息,我们可以知道该测试用例已经执行成功了。终端中,展示的重要信息主要有执行该测试用例所用的时间(s);执行的测试次数;成功率等。

    图片描述

    Rally要比Tempest更加人性化的一个地方在于,可以输出利于分析和浏览的用户图形化HTML报表。执行如下命令,生成HTML报表:

    # rally task report 9866b3b3-58c2-4069-819b-f099e507c7e5 --out keystone-create-user.html
    

    将Docker容器中的该HTML文件传到主机系统中,如下把ID为ad0ec05e9908的容器中的/home/rally/samples/tasks/scenarios/keystone/目录下的keystone-create-user.html文件拷贝到主机的当前目录下:

    # docker cp ad0ec05e9908:/home/rally/samples/tasks/scenarios/keystone/keystone-create-user.html ./
    
    # ls
    keystone-create-user.html
    

    由于打开Rally的HTML测试报告,会在线调用Google的AngularJS生成报表,因此需要在科学上网的情况下浏览,使用Firfox或者Chrome浏览器打开该HTML文件。如下图所示:

    图片描述

    2.如何不科学上网,也能看测试报表

    如果,不想在科学上网的情况下,也能浏览HTML测试报表,那该怎么办呢。别急,笔者琢磨出了一个移花接木之法,。——即替换Google的JS框架。

    为了能在不科学上网的情况下查看报表,因此下面,我们需要修改源码程序。下面呢,我就分享下吧。

    1)切换目录

    # cd /usr/lib/python2.7/site-packages/rally

    2)查找Google的js url路径

    # grep googleapis -R .
    ./ui/templates/task/report.mako:<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.mins"></script>
    ./ui/templates/verification/report.mako:<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jqueryin.js"></script>

    3)替换 googleapis

    # vim ./ui/templates/verification/report.mako
     ## -*- coding: utf-8 -*-
     <%inherit file="/base.mako"/>
    
     <%block name="title_text">Tempest report</%block>
    
     <%block name="libs">
     <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
     </%block>
    
    # vim ./ui/templates/task/report.mako
    ## -*- coding: utf-8 -*-
     <%inherit file="/base.mako"/>
    
     <%block name="html_attr"> ng-app="BenchmarkApp"</%block>
    
     <%block name="title_text">Benchmark Task Report</%block>
    
     <%block name="libs">
       <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.1.15-beta/nv.d3.min.css">
       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.13/d3.min.js"></script>
       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.1.15-beta/nv.d3.min.js"></script>
     </%block>

    4)OK,这样以后我们再次运行Rally测试时,就可以不用科学上网,也能直接查看测试出来的报表了。

    四.保存和使用Rally Docker

    1)保存Rally Docker镜像
    当我们制作好了Rally镜像之后,如果不做commit保存起来,那么container停止以后再启动,这些更改就消失了。在完成操作之后,输入 exit命令来退出这个容器。

    # exit
    Exit

    现在,我们可以使用 docker commit 来保存镜像。

    # docker commit -m="OpenStack Rally Docker" -a="Xu chao" 8e9cce8d1d71 openstack/rally:v1

    这里的-m标识我们指定提交的信息,-a标识来指定一个作者,openstack/rally是一个新的镜像名,v1是版本号。

    现在,我们可以使用 docker images 命令来查看我们的新镜像openstack/rally。

    # docker images

    图片描述

    2)使用我们的新镜像来运行Rally docker

    # docker run -i -t openstack/rally:v1 /bin/bash
    [root@3d6864153dc0 /]# exit
    exit

    3)最后,我们使用docker save 命令将镜像导出到本地文件,默认目录为执行docker命令的用户家目录下。

    # docker save -o rally_centos7.tar openstack/rally:v1
    # ls
    rally_centos7.tar

    4)当我们把自己做好的镜像上传到Docker Hub公共库或内部私有库中后,别人便可以直接导入镜像,离线使用了。

    # docker load < rally_centos7.tar

    5)将镜像推送到Docker Hub上
    由于,上传的镜像必须以docker hub注册的用户名开头,因此这里,我需要重新命名镜像。

    # docker commit ad0ec05e9908 xiaoxu780/openstack_rally
    33c3c6cf1641a57e22df645387d1bfc74fb4ac011c17896f2e1d044f56116eb9

    查看本地有哪些镜像

    # docker images
    REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    xiaoxu780/openstack_rally   latest              33c3c6cf1641        26 seconds ago      635.9 MB
    openstack/rally             v1                  abb601c4cc96        21 hours ago        635.9 MB
    docker.io/centos            7                   eeb3a076a0be        5 days ago          196.7 MB

    选择推送的镜像

    # docker push xiaoxu780/openstack_rally
    Do you really want to push to public registry? [y/n]: y
    The push refers to a repository [docker.io/xiaoxu780/openstack_rally] (len: 0)
    Sending image list
    Pushing repository docker.io/xiaoxu780/openstack_rally (1 tags)
    …………

    最后,登录Docker Hub 查看或搜索上传成功的xiaoxu780/openstack_rally镜像。

    五、安装Rally的方式

    1.单独安装

    最简单的安装Rally的方式就是通过它的安装脚本进行安装。

    # wget -q -O- https://raw.githubusercontent.com/openstack/rally/master/install_rally.sh | bash

    安装脚本会检测Rally所需要的软件是否已经安装在系统中;如果是以 root 用户执行而其中的一些依赖没有安装,那么脚本会询问您是否想要安装这些所需要的包。

    默认情况下,当以标准用户执行时会将 Rally 安装到 ~/rally 目录下的一个虚拟环境中,或以 root 用户执行则安装到整个系统中。您可以使用 –target 选项将 Rally 安装到一个虚拟环境中:

    # ./install_rally.sh --target /foo/bar

    您也可以以 root 用户执行脚本,不使用 –target 选项,而把 Rally 安装到整个系统中:

    # ./install_rally.sh

    安装完成后,您还可以配置Rally的数据库(可选):

    # rally-manage db recreate

    2.通过DevStack 安装

    DevStack除了可以安装OpenStack、Tempest等之外,当然还可以安装 Rally。首先,克隆对应的仓库代码:

    # git clone https://git.openstack.org/openstack-dev/devstack
    # git clone https://github.com/openstack/rally

    然后,配置 DevStack 以运行 Rally:

    # cd devstack
    # cp samples/local.conf local.conf
    # echo "enable_service rally" >> local.conf

    最后,只需要运行 DevStack 即可:

    $ ./stack.sh

    3.通过 Docker安装和使用

    即是本篇所做内容。


    作者简介
    徐超。专注于工作和研究基于OpenStack产品研发测试过程的持续集成、持续测试和持续部署/交付领域,曾参与创建国内一OpenStack服务提供商从0到1+的测试体系。




  • 相关阅读:
    解决:error: Cannot find libmysqlclient_r under /usr/local/mysql.
    LDFLAGS 与 LDLIBS
    一些有用的github收藏(持续更新中...)
    ros 学习 array 的添加
    visual studio code利用自身携带debug调试
    declaration of 'int ret' shadows a parameter
    invalid application of ‘sizeof’ to incomplete type
    qml demo分析(samegame-拼图游戏)
    qml demo分析(rssnews-常见新闻布局)
    qml demo分析(photosurface-图片涅拉)
  • 原文地址:https://www.cnblogs.com/ztguang/p/12646830.html
Copyright © 2011-2022 走看看