在云原生时代,利用Gatling在Kubernetes和Docker环境中进行性能测试,能更真实地模拟现代应用负载。
Gatling云原生测试模式
在云原生环境中,主要有三种部署Gatling测试的模式:
单容器运行,内网压测、简单验证,Docker环境变量、自定义测试脚本、结果持久化
集群分布式,大规模并发测试,Gatling Operator、集群资源管理、聚合报告
API驱动,集成CI/CD、动态测试 ,Gatling Server、REST API任务触发、S3存储集成
Gatling 镜像构建和配置
将Gatling测试容器化是在云原生环境中执行测试的第一步。
基础镜像构建:建议直接从Gatling官网下载Standalone版本构建,这样能保持对Gatling版本的直接控制。一个典型的Dockerfile示例如下:
Dockerfile
FROM ubuntu:18.04
MAINTAINER your_name "your_email@example.com"
# 复制本地Gatling安装包和测试脚本
COPY sources.list ./
COPY your_test.scala ./
ADD gatling ./gatling
# 安装依赖(注意版本兼容性)
RUN rm /etc/apt/sources.list\
&& mv sources.list /etc/apt/sources.list\
&& rm /gatling/user-files/simulations/computerdatabase/ -R \
&& mv your_test.scala /gatling/user-files/simulations/your_test.scala \
&& apt-get update \
&& apt-get install -y openjdk-8-jdk # 或更新版本JDK
CMD ["/gatling/bin/gatling.sh"]
动态配置:测试目标地址等参数可通过环境变量传入。在Scala脚本中,使用sys.env("TARGET_URL")读取,这样能在构建镜像后灵活调整测试目标。
运行优化:直接运行gatling.sh可能会遇到交互提示问题。可通过预置输入文件(如command.txt)重定向解决。更可靠的方式是使用gatling.sh -s YourSimulationClass非交互模式。
Kubernetes部署和测试策略
在K8s中部署Gatling主要考虑资源调度和测试任务管理。
基础Pod部署:Gatling容器在K8s中运行时,通常无需暴露服务端口,因为它主要作为流量发起方。一个基本的Pod配置示例:
yaml
apiVersion: v1
kind: Pod
metadata:
name: gatling-test-pod
spec:
containers:
- name: gatling
image: your-registry/gatling:test
command: ["/bin/bash"]
args: ["-c", "sleep infinity"] # 保持容器运行便于exec
env:
- name: TARGET_URL
value: "http://your-service:port"
restartPolicy: Never
通过kubectl exec进入Pod手动执行测试。这种方式简单,适合调试和一次性测试。
使用Gatling Operator:对于生产级负载测试,建议使用Gatling Operator。它通过自定义资源定义(CRD)管理测试生命周期:
定义Gatling资源YAML,指定测试脚本、并行度、资源限制等
自动创建和管理测试Job及Pod
支持测试完成后将结果归档到云存储(如AWS S3)
可配置发送测试结果通知(例如到Slack)
集群内测试优势:在K8s集群内部运行Gatling测试,可避免公网带宽限制,更准确地评估服务在真实内网环境下的表现。
高级测试管理和扩展
随着测试复杂度的增加,需要考虑更高级的管理和扩展方案。
Gatling Server API化:项目gatling-server提供了REST API来提交和管理Gatling任务:
通过HTTP端点提交单个Scala脚本或打包的测试jar
支持从S3下载测试脚本和上传测试结果
可查询任务状态、日志和测试报告
示例请求:
bash
curl -v -F 'file=@./YourSimulation.scala' \
-F "simulation=your.package.YourSimulation" \
-F "javaOpts=-DbaseUrl=http://your-service -DdurationMin=5" \
http://gatling-server:58080/task/upload/http
分布式测试:单机资源有限时,可借助像Gatling Pea这样的工具,协调多个Gatling节点共同施压,并汇总生成统一报告。
CI/CD流水线集成:将Gatling测试嵌入CI/CD流程(例如使用Jenkins),可实现自动化性能验证和质量门控。
结果收集监控
有效收集和分析测试结果。
结果持久化:Gatling容器内默认的报告路径应挂载到持久存储或推送到对象存储(如S3)。
报告可视化:可将Gatling生成的HTML报告通过Nginx等静态服务器提供Web访问。
运行日志:除了测试报告,还应通过K8s的kubectl logs或Gatling Server的API收集测试过程中的控制台日志,以便排查问题。
注意事项和建议
在云原生环境中运行Gatling测试时,请关注以下方面:
资源限制:为Gatling测试Pod配置合理的CPU、内存请求和限制,避免测试程序本身成为资源瓶颈或影响集群其他应用。
测试数据管理:保证测试所需的 feeders 或其它资源文件正确嵌入镜像或能通过初始化容器下载。
网络策略:若集群使用网络策略,需保证Gatling Pod有权限访问目标服务。
镜像优化:在保证测试需求的前提下,尽量选用轻量级基础镜像,减少层数和体积,以加速部署。
失败处理:明确测试Pod的重启策略。通常,完整的性能测试Job在结束(无论成功和否)后,不应自动重启。
在云原生环境中,可以根据测试需求和基础设施条件,灵活选择Gatling的运行模式:从简单的单Pod测试,到由Operator管理的分布式测试,再到通过API触发的自动化测试。主要在于将测试也视为应用的一部分,用云原生的方式去管理和运行。