本文共 3656 字,大约阅读时间需要 12 分钟。
基础设施测试框架的重要性
传统的基础设施管理以手动任务为主,由系统管理员操作静态服务器。然而,现代云平台的自动化能力正在改变这一工作方式:基础设施被描述为“代码”,自动化管理系统能够对基础设施进行动态变更。这种趋势使得基础设施更加动态,周转时间也大大缩短。
在基础设施测试方面,测试框架不仅用于验证机器镜像的状态(如Amazon Machine Images、Google Compute Images或Oracle OCI Images),而且随着容器化基础设施的普及,容器镜像测试也变得同样重要。
在MySQL生态中,我们越来越多地使用容器来替代虚拟机。此外,越来越多的核心基础设施运行在Oracle的云基础设施(OCI)上。这要求我们实现多层级的自动化,并且能够利用基础设施测试来验证服务器(无论是虚拟机、容器还是其他形式)的状态。基础设施测试同样用于验证发布的工件状态。
本文将重点介绍如何使用自动化基础设施测试来验证MySQL Server Docker镜像。我们将比较三个适用于容器测试的框架,并提供示例代码。
基础设施测试的主要目的是验证基础设施的状态:例如,Apache服务器是否在监听80端口,DNS服务器的配置是否正确,是否反映在resolv.conf文件中,是否所有必要的二进制文件已存在于机器镜像中。
这些测试通常以bash脚本的形式存在,用作配置任务的一部分,或者在创建实例后手动验证。自动化基础设施测试更进一步,它不仅对大量的基础设施和脚本的正确性进行验证,还能处理现代动态云环境中的许多手动操作。
基础设施测试工具通常与Ansible、Puppet或Chef等配置工具结合使用。配置工具在机器上安装软件,而测试框架则确保它们能够正常运行。所有内容都可以通过代码表示,并通过工具进行自动化。
对于我们来说,测试 Docker镜像的目标主要是验证软件包的版本是否正确,以及这些二进制文件的功能是否正常。镜像构建期间可能会遇到网络故障,导致软件包安装不完整,因此我们需要通过自动化测试来捕捉这些问题。
在评估测试工具时,需要考虑以下两个方面:
我们将关注以下三个工具:
InSpec基于RSpec(Ruby)测试框架,借鉴了Serverspec的经验,是Chef生态系统的一部分,用于配置和测试基础设施。配置保存在一个ruby文件中,支持多种配置语言,通过targets(local/ssh/docker)来测试执行。
Goss是Serverspec的一个快速而简单的替代品,由Go语言开发,是一个服务器测试和验证框架。配置保存在yaml文件中,可以方便地从当前系统状态生成,支持多种配置语言,支持在本地和Docker容器中执行测试(通过dgoss脚本)。
Container Structure Test是用于验证容器镜像结构的框架,由Go语言编写,使用yaml配置文件。该项目于今年早些时候发布,应用范围相对较窄(只支持容器),但提供了足够的功能来测试镜像。它支持的配置语言较少,测试执行仅限于本地容器。
运行示例需要在本地安装InSpec、Goss和Container Structure Test。
在Linux平台上:
curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.6/goss-linux-amd64 -o goss && chmod +x gosscurl -L https://raw.githubusercontent.com/aelsabbahy/goss/master/extras/dgoss/dgoss -o dgoss && chmod +x dgosscurl -L https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 -o container-structure-test && chmod +x container-structure-test
将这些文件添加到系统路径中后,可以通过shell脚本运行测试。
我们提供了用于测试这三个框架的MySQL Server Docker镜像的示例文件。
克隆存储库:
git clone https://github.com/neumayer/mysql-server-image-tests.git
存储库中包含以下配置文件:
mysql-server-inspec.rb
goss.yaml
mysql-server-container-structure-test.yml
control 'container' do impact 0.5 describe docker_container('mysql-server') do it { should exist } it { should be_running } its('repo') { should eq 'mysql/mysql-server' } its('ports') { should eq '3306/tcp, 33060/tcp' } its('command') { should match '/entrypoint.sh mysqld' } end control 'server-package' do impact 0.5 describe package('mysql-community-server-minimal') do it { should be_installed } its('version') { should match '8.0.12.*' } end end control 'shell-package' do impact 0.5 describe package('mysql-shell') do it { should be_installed } its('version') { should match '8.0.12.*' } end endend
file: /usr/sbin/mysqld exists: true contains: []package: mysql-community-server-minimal installed: truepackage: mysql-shell installed: trueport: tcp6:3306 listening: true ip: []port: tcp6:33060 listening: true ip: []user: mysql exists: trueprocess: mysqld running: true
schemaVersion: "2.0.0"metadataTest: exposedPorts: ["3306"]
InSpec测试:
docker run -d --name mysql-server mysql/mysql-serverinspec exec mysql-server-inspec.rb --controls containerinspec exec mysql-server-inspec.rb -t docker://mysql-server --controls server-package
Goss测试:
GOSS_SLEEP=10 dgoss run -p 3306:3306 mysql/mysql-server
Container Structure Test测试:
container-structure-test run -p 3306:3306 mysql/mysql-server
通过以上工具,我们可以对 MySQL Server Docker镜像进行全面测试,确保其在运行时的正确性和可靠性。选择合适的工具取决于您的具体需求和测试场景。
转载地址:http://nndfk.baihongyu.com/