技术文章

BLOG

如何基于公有云构建SDS大规模测试环境?

2019-02-19 · XSKY

​​SDS的一大特点就是规模大,集群内的硬件资源和软件资源都很多,比如超过100个节点和500个硬盘是很常见的。所以我们需要有大规模的环境来实际测试我们的产品。

XSKY目前在本地office和远端IDC数据中心架设了庞大的各类品牌服务器资源,搭建了从千兆,万兆,100G,到FC不同的复杂网络环境,用作SDS的大规模测试。但即便如此,大量的SDS自动化测试仍然需要更加灵活、经济的方式。

都使用物理机来搭建大规模集群,不仅成本太高,而且不灵活。所以,我们开发了Endurance项目,通过使用公有云来构建大规模的测试环境。

图片来源网络图片来源网络

开发Endurance之前,我们也考虑过用公有云的formation工具来实现环境部署功能,例如AWS CloudFormation。但是这些formation工具基本只能做到公有云资源的操作,而且主要是用于创建资源。我们不仅需要创建资源,还需要灵活的控制资源,并且能够跟踪整个资源的生命周期。因此,我们决定自己开发一套系统来满足自己的需求。

一、Endurance的架构

Endurance由一个controller和多个agent组成,controller负责测试环境的管理,agent则部署到每个虚拟机上,接受controller发送的命令并执行对应的操作。Endurance的部署架构如下:

每个测试集群采用VPC进行网络隔离。Endurance controller的主要职责包括:

  • 虚拟机管理
  • 虚拟网卡管理
  • 云硬盘管理
  • SDS版本部署
  • SDS系统的服务器、硬盘、存储池的创建
  • 部署性能监控组件

Endurance的agent主要职责包括:

1、执行controller下发的任务,包括:

  • 安装SDS
  • 环境配置

2、提供RPC接口让测试用例可以注入故障,比如

  • kill执行的进程
  • 控制硬件状态

在使用Endurance创建测试环境之前,我们会先把公有云的信息添加到它的数据库中,比如账号、虚拟机镜像、VPC 和subnet等。因为网络规划需要统一,所以Endurance使用的VPC和subnet都是事先创建好的,在请求建立一个测试环境时,只需要选择SDS不同网络所需要的网段即可。

当我们需要创建一个测试环境时,流程如下:

1、通过一个YAML文件提交测试环境请求给controller

2、controller解析YAML文件,根据指定的要求准备好测试环境,主要步骤包括:

  • 使用指定镜像创建虚拟机,并且配置好网络。
  • 安装Endurance agent到虚拟机上。
  • 创建指定规格的云硬盘,并且挂载到指定的虚拟机。
  • 配置好虚拟机的环境。
  • 安装SDS软件。
  • 调用SDS的API添加服务器、硬盘,以及创建存储池。

这样,我们就有了一个可以进行测试的大规模集群。随后,就可以运行指定的自动化测试用例,这些用例不仅可以通过SDS API来操作集群,还可以通过Endurance agent提供的 RPC 来执行很多操作底层的操作,例如故障注入等。

测试环境YAML文件示例

测试环境YAML文件示例

启动测试环境构建启动测试环境构建

Endurance构建测试环境的过程Endurance构建测试环境的过程

当使用 Endurance创建了一个环境时,可以选择开启性能监控组件。开启之后,Endurance会安装一个带外的Prometheus以及相应的exporter来收集性能数据,也会安装Jaeger并开启管里面的tracing功能来收集管理面操作的性能数据。

在测试用例运行完成之后,只要告诉Endurance拆除指定的测试环境,Endurance就会清除所有的虚拟机和云硬盘。

二、AWS中使用多个网卡的问题

我们的SDS虽然可以管理大部分的系统硬件和配置,但是网络是需要事先配置好的。SDS最多可以支持4个网络,所以我们的EC2 instance也需要配置多个不同的虚拟网卡(ENI),并且给每个ENI配置不同的静态地址和子网,一个EC2 instance上的不同ENI会分别加入同一个VPC的不同subnet。在我们的设计中,Endurance controller是通过虚拟机的管理网络的地址来ssh到虚拟机上。

当我们为EC2实例配置多个ENI时,我们遇到了一个网络问题:如果像物理机一样,只是只通过写 /etc/sysconfig/network-scripts/ifcfg-nicname 来配置网卡的静态地址会导致虚拟机的路由出现问题。这个路由问题的表现大概是这样的,通过管理网进来的报文不会从管理网出去,导致ssh无法通讯。

这个问题称为Asymmetric Routing。如果你使用的是Amazon Linux,系统自带了ec2-net-utils工具解决了这个问题。如果使用的是Ubuntu,那么也有开源的ec2-net-utils移植项目:https://github.com/ademaria/ubuntu-ec2net 来支持。对于 CentOS 系统,也有人提供了脚本来处理:https://github.com/aureq/aws-toolbox/tree/master/ec2/eni/multi-eni-routing 

我们为了更好的控制网络,通过Endurance agent来更改网络配置来处理这个问题。要解决这个问题,我们需要使用策略路由,就需要为每个ENI在 Linux下配置不同的路由表。下面来看具体的处理:

假设系统默认的网卡是eth0,我们配置为管理网络,地址为10.10.4.11/24,现在要再添加一个新的网卡eth1,地址为 10.10.5.11/24。我们除了要为eth1写ifcfg-eth1这个配置文件以外,还需要增加一个专门的路由表和一个路由规则。

为eth1创建一个路由表,添加到 /etc/iproute2/rt_tables 中:

创建 /etc/sysconfig/network-scripts/route-eth1 ,添加路由到路由表 eth1.rt,表示 10.10.5.0/24的流量都从eth1出。

创建 /etc/sysconfig/network-scripts/rule-eth1,说明从eth1进来的报文使用路由表eth1.rt。

通过上面的配置,我们可以指定从eth1网卡进来的子网只从这个网卡返回,不会从其他网卡返回。重启网络服务后,你可以通过ip命令来检查:

其中ip rule显示的路由规则前的数字是规则的优先级,越小优先级越高。

配置好eth1的策略路由后,我们还需要设置系统的默认网关为eth0,这样从 eth0进来的报文才会从eth0返回。通过修改 /etc/sysconfig/network来实现:

CentOS中这个配置文件默认为空,也就是没有指定默认网卡。这样,所有非eth0进来的子网的报文都会从同一个网卡返回,而通过eth0进来的报文,即我们的管理网报文,就会从默认网卡eth0返回。整个网络就打通了。

三、Endurance的特点

部署灵活

可以根据需要部署指定规模和配置的集群。最常用的配置包括CPU、内存、操作系统版本、云硬盘类型、云硬盘大小、云硬盘数量。

使用方便

1、通过一个YAML文件就可以指定我们需要的集群信息。

2、公有云和办公网通过VPN连接在一起,开发和测试都可以轻松访问集群。

节约成本

不需要购买物理机,也就没有机房的存放成本、硬件损坏成本以及其他物理机的管理成本。

集群部署速度快

整个集群的部署分为两个阶段,部署第一台节点和部署其他节点。

公有云平台启动一个虚拟机大约需要3分钟,我们安装 SDS 软件大约需要5分钟,再加上一些其他的操作,我们的第一个阶段会在10分钟内完成。

第二个阶段的虚拟机是并发创建和安装的,所以不论要添加多少台节点,第二个阶段一般都在10分钟内完成。

所以,一般我们只需要20分钟就可以创建一个测试集群,并且所有的机器都会添加到集群中。

与测试用例集成方便

Endurance的YAML 模板提供了直接执行测试用例的能力,可以在测试环境部署好之后直接开始执行测试用例,通过协商好的配置文件把集群的信息提供给测试用例。

另外,Endurance agent提供的RPC用于操作集群的软硬件,测试用例可以减少使用ssh来执行命令,方便测试用例的开发。

四、总结

本文整理和归纳了如何基于公有云为SDS构建大规模自动化测试集群的方案和执行过程,并针对这个过程中AWS中使用多个网卡的问题,提出了解决方案。

随着各行业用户对SDS的大规模采用,集群数量和规模持续扩大,以及SDS功能的不断丰富和演进,XSKY开发的Endurance提供了经济、高效、灵活的超大规模自动化测试手段,为用户持续打造高可靠、稳定的SDS产品“保驾护航”。​​​​