在 Kubernetes 上使用 Jmeter 运行压力测试

简介: Kubernetes 的资源和任务调度能力,能给自动化测试提供相当大力的支持,这里以 Jmeter 为例,讲讲如何在 Kubernetes 中使用 Jmeter 进行简单的性能测试。 开始之前 录制任务:本文所用镜像为 Jmeter 3.x 版本,建议提前录制一个简单的测试任务进行下面的操作。

Kubernetes 的资源和任务调度能力,能给自动化测试提供相当大力的支持,这里以 Jmeter 为例,讲讲如何在 Kubernetes 中使用 Jmeter 进行简单的性能测试。


开始之前

  • 录制任务:本文所用镜像为 Jmeter 3.x 版本,建议提前录制一个简单的测试任务进行下面的操作。
  • 支持 Jobs 的 Kubernetes 集群,以及缺省的 StorageClass 支持,能够实现 PVC 的动态供应。
  • 互联网连接。

试验内容

  1. 搭建一个 Web DAV 服务,用于提供给 Jmeter 输入输出场所,也便于日后 CI/CD 工具的案例输入或结果输出。
  2. 运行单实例的 Jmeter 测试任务。
  3. 运行集群形式的 Jmeter 测试任务。

预备存储

这一步骤并非强制,完全可以通过 scp 或者 mount 等其他方式来实现

这里我们做一个 Web DAV 服务,挂载一个 PVC,在其中分为 input 和 output 两个目录,实际使用过程中,可以进一步按照任务或者 Job 对目录进行更详尽的规划。

首先创建名为jmeter-task的存储卷:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: jmeter-task
spec:
 accessModes: - ReadWriteMany
 resources:
 requests:
 storage: 1Gi

存储卷创建之后,可以使用cadaver或者WinSCP等工具去建立目录。

接下来上传*.jmx文件,到input目录之中,这里我录制的一个持续访问京东首页的任务,命名为jd.jmx。

单实例测试

单实例测试很容易,使用 Kubernetes 的 Job 方式即可:

apiVersion: batch/v1
kind: Job
metadata:
 name: jmeter
spec: template:
 metadata:
 name: jmeter
 spec:
 restartPolicy: Never
 containers: - name: jmeter
 image: dustise/jmeter-server
 command: - "/jmeter/bin/jmeter" - "-n" - "-t" - "/jmeter/input/jd.jmx" - "-l" - "/jmeter/output/log" - "-j" - "/jmeter/output/joker"
 volumeMounts: - name: data
 mountPath: /jmeter/input
 subPath: input
 - name: data
 mountPath: /jmeter/output
 subPath: output
 volumes: - name: data
 persistentVolumeClaim:
 claimName: jmeter-task

上面的定义中:

  • 任务 Pod 加载了存储卷jmeter-task。使用subPath指令,分别挂载了输入和输出目录。
  • 使用-n -t的方式运行测试任务,并把输出文件定位到output目录中。

接下来就可以使用kubectl create -f jobs1.yaml来运行这一任务。

任务启动之后,可以:

  • 使用kubectl get jobs来查看任务运行状况。
  • kubectl get pods –show-all查看任务 Pod。
  • kubectl logs -f [pod name]查看任务输出。

最后任务会变成完成状态,就可以在 Web DAV 中查看任务报告了。

集群测试

Jmeter 可以使用控制台+负载机的形式,使用多个节点进行压力测试,这里需要解决的一个最重要问题就是,在指派任务给负载机时,Jmeter 需要使用-R host:port的参数,来指定任务要调用的负载机。这一通信是无法通过 Kubernetes 方式的 Service 来完成的。必须建立 Pod 之间的通信,而 Pod 的主机名地址是很飘逸的,同时,我们还是希望负载节点的数量能够实现较为自由的伸缩,因此解决方法就只有 StatefulSet 了。

这个 YAML 很长,所以放在最后了,说说其中的要点:

  • 注解中的security.alpha.kubernetes.io/sysctls:实际运行中,jmeter 负载机是需要对内核参数进行一点调整的,Pod 中可以用这一方式进行调整,https://kubernetes.io/docs/concepts/cluster-administration/sysctl-cluster/ 中有更详细的关于这方面的内容讲解。
  • spec.affinity:这里设置 Jmeter Pod 尽量分布在不同节点上。
  • RMI_HOST环境变量:使用每个 Pod 的 IP 为这一变量赋值。
  • Service:利用这个 Headless 服务,为每个 Pod 提供主机名支持。

启动这个 Statefulset 之后,会看到规律创建的 Pod 名称:

jnode-0 1/1 Running 0 1h
jnode-1 1/1 Running 0 1h

对应的主机名称就应该是 jnode-0.jfarm,jnode-1.jfarm。所以上面的job.yaml可以新增-R jnode-0.jfarm:1099,jnode-1.jfarm:1099即可。

使用kubectl create启动任务之后,查看该任务 Pod 的日志,会出现大致这样的内容:

Creating summariser <summary> Created the tree successfully using /jmeter/input/jd.jmx
Configuring remote engine: jnode-0.jfarm:1099 Configuring remote engine: jnode-1.jfarm:1099 Starting remote engines
Starting the test @ Thu Nov 16 07:24:14 GMT 2017 (1510817054558) Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary + 302 in 00:01:16 = 4.0/s Avg: 2967 Min: 2627 Max: 5457 Err: 0 (0.00%) Active: 0 Started: 20 Finished: 20
summary + 98 in 00:00:00 = 3062.5/s Avg: 3270 Min: 2635 Max: 7192 Err: 0 (0.00%) Active: 0 Started: 20 Finished: 20
summary = 400 in 00:01:16 = 5.3/s Avg: 3041 Min: 2627 Max: 7192 Err: 0 (0.00%) Tidying up remote @ Thu Nov 16 07:25:31 GMT 2017 (1510817131966) ... end of run

可以看到,成功配置远程负载服务器之后,测试开始,最后成功完成。

Statefulset 源码

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
 name: jnode
 labels:
 app: jmeter
 component: node
spec:
 serviceName: jfarm
 replicas: 2
 selector:
 matchLabels:
 app: jmeter
 component: node
 template:
 metadata:
 labels:
 app: jmeter
 component: node
 annotations:
 security.alpha.kubernetes.io/sysctls: net.ipv4.ip_local_port_range=10000 65000,net.ipv4.tcp_syncookies=1
 spec:
 affinity:
 podAntiAffinity:
 preferredDuringSchedulingIgnoredDuringExecution: - weight: 100
 podAffinityTerm:
 topologyKey: kubernetes.io/hostname
 labelSelector:
 matchExpressions: - key: app
 operator: In
 values: - jmeter
 - key: component
 operator: In
 values: - node
 restartPolicy: Always
 containers: - name: jmeter
 image: dustise/jmeter-server
 ports: - name: server
 containerPort: 1099 - name: rmi
 containerPort: 20000
 env: - name: RMI_HOST
 valueFrom:
 fieldRef:
 fieldPath: status.podIP
---
apiVersion: v1
kind: Service
metadata:
 name: jfarm
 labels:
 app: jmeter
spec:
 clusterIP: None
 ports: - port: 1099
 name: server
 selector:
 app: jmeter
 component: node
本文转自kubernetes中文社区- 在 Kubernetes 上使用 Jmeter 运行压力测试
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
测试技术 Shell API
Playwright系列(3):运行测试用例
Playwright系列(3):运行测试用例
|
4月前
|
测试技术
软件测试/测试开发/全日制|Pytest如何灵活地运行用例
软件测试/测试开发/全日制|Pytest如何灵活地运行用例
34 0
|
5月前
|
Ubuntu Linux 定位技术
Trinitycore学习之在Linux环境上搭建服务器并测试运行
Trinitycore学习之在Linux环境上搭建服务器并测试运行
75 0
|
5月前
|
存储 C语言 Windows
音视频使用qt测试ffmpeg接口时无法运行
音视频使用qt测试ffmpeg接口时无法运行
52 0
|
5月前
|
应用服务中间件 测试技术 nginx
dpdk环境搭建及运行helloworld测试
dpdk环境搭建及运行helloworld测试
89 0
|
4月前
|
监控 数据可视化 Java
jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
53 1
|
5天前
|
数据采集 DataWorks 关系型数据库
DataWorks操作报错合集之在DataWorks运行任务时出现链接超时,但在测试连通性时显示正常连通是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
17 0
|
6天前
|
SQL DataWorks Java
DataWorks操作报错合集之在阿里云 DataWorks 中,代码在开发测试阶段能够成功运行,但在提交后失败并报错“不支持https”如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
21 1
DataWorks操作报错合集之在阿里云 DataWorks 中,代码在开发测试阶段能够成功运行,但在提交后失败并报错“不支持https”如何解决
|
6天前
|
测试技术 Python
python运行集成测试
【4月更文挑战第22天】
7 1
|
7天前
|
XML 测试技术 持续交付
python运行集成测试
【4月更文挑战第21天】
16 2

推荐镜像

更多