Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。JMeter也提供了Master/Slave模式,可以组成一个压力测试集群,进行分布式的测试或者进行更大压力的测试。

d04b97988dd9e8309e7e2768f5ea373f.png

但基于大量虚拟机的Jmeter集群有个缺点,就是不方便管理,比如需要重启Jmeter服务,还需要一个个的连接到虚拟机上进行操作,而且安装部署不方便(无法一键部署),也不方便将集群封装成整体应用对外提供服务。而Kubernetes 的资源和任务调度能力能给性能测试提供相当大力的支持。本文就讲讲如何在 Kubernetes 中使用 Jmeter 进行简单的性能测试。

开始之前

  1. 需要一个被测试的环境和K8S,相信之前跟着我的文章一步步做下来已经有一个微服务的环境了。

  2. 需要有一个jmeter 测试脚本,这个脚本我建议用限定TPS方式的准备。Thread Group里增加一个Precise Throughput Timer用以控制脚本的压力输出。这样在K8S里,我们通过控制压力输出来控制输出POD的CPU使用。

集群测试Jmeter 可以使用master+slave的形式,使用多个节点进行压力测试。slave 启动的是jmeter server,listen在指定的端口上等master 指派任务。master在指派任务给slave时,Jmeter 需要使用-R host:port的参数通知slave。如果我们要把这种集群运行在K8S里,需要解决的一个重要问题就是,来指定任务要调用的负载机。这一通信是无法通过 Kubernetes 方式的 Service 来完成的。必须建立 Pod 之间的通信。如果采用Deployment的话, Pod 的地址和名字都是随机的,同时,我们还是希望负载节点的数量能够实现较为自由的伸缩,因此解决方法就只有 StatefulSet + Service了。

5ac9e16e32be570d599fb8938c5baa7c.png

在这个示例里,为了简单起见,暂时也不使用动态伸缩的功能来做压力测试。为了更省事,我这里直接在NODE节点上跑Jmeter master。到正式应用的时候,也可用Kubernutes Job的形式来跑Master。在参考资料里,也给出一些参考。有兴趣的朋友可以根据参考资料中的文档,将master节点用job来执行。

构建StatefulSet的 YAML 要点

具体的YAML文件可以后台给公众号留言获取,也可以通过参考资料5来自行创建,稍作改动即可。

镜像选择

在hub.docker.com上可以找到上千个相与jmeter相关的镜像,我选择了流行度和更新速度都比较好的egaillardon/jmeter来进行演示。当然jmeter本身也比较简单,如果有足够的兴趣,完全也可以自已从jdk8作为基础自行打出所需要的jmeter docker镜象作为基础。

0bf89e61dcb98bd94ac13a025e7c7b38.png

TCP源端口设置(和测试需要的TCP连接数相对应)

注解中的security.alpha.kubernetes.io/sysctls:实际运行中,jmeter 负载机是需要对内核参数进行一点调整的,Pod 中可以用这一方式进行调整,https://kubernetes.io/docs/concepts/cluster-administration/sysctl-cluster/ 中有更详细的关于这方面的内容讲解。

亲和力设置

spec.affinity:这里设置 Jmeter Pod 尽量分布在不同节点上。当然,这条不是必须的,个人建议在测试配置中指定每个jmeter slave的压力输出值,从而控制jmeter的CPU使用。如果你的压力输出和被测的服务在同一个K8S集群上时,这一点就显的尤其重要,可以有效的防止相互影响而无法判断到底是哪里出了问题。

RMI_HOST环境变量:使用每个 Pod 的 IP 为这一变量赋值。

ssl设置:Jmeter 缺省使用ssl,我这个演示的测试禁止了SSL

Service:利用这个 Headless 服务,为每个 Pod 提供主机名支持。

在K8S里部署JMeter Server

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

91cadb3b63514b7eba308c567936f1b6.png

可以看到,这些POD已经准备好执行了

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

jnode-0                   1/1       Running   0          1h

jnode-1                   1/1       Running   0          1h

对应的主机名称就应该是 jnode-0.jfarm,jnode-1.jfarm。

启动测试

在node或者在pod里执行:

 ./apache-jmeter-5.1.1/bin/jmeter.sh -n -t aaa.jmx  -Rjnode-0.jfarm:1098,jnode-1.jfarm:1098,jnode-2.jfarm:1098 -Jserver.rmi.ssl.disable=true  -o output/test1 -lzull -e

244aa1018ca22a42a71fbec381e1f402.png

注:如果在POD里执行,要注意资源的使用情况;所以建议在node上执行。由于k8s集群的master 的DNS并不指向K8S里的DNS服务,所以如果在master上执行的话,需要手工将Master操作系统里的DNS指向改成K8S集群里的DNS。同时还需要额外安装Jmeter和JDK。

在完成测试后,我们可以看一下output/test1目录下的报告

45c15dda1bb2416a72fed4bf9eeb1292.png

这样,一个简单的可运行在K8S集群上的Jmeter测试就完成了。通过K8S的scale操作,可以很方便的扩充 Jmeter  节点的数量。可以看到, K8S和Jmeter组合,可以大大降低使用jmeter集群测试时的管理工作量,提升测试的效率。本文只是介绍了一个在K8S里用JMeter进行测试的入门,更多的功能等着大家一起来发现。例如:和CI/CD工具配合进行测试;将结果自动收集,并通过WEB进行展示等。 参考资料
  1. JMeter官网  http://jmeter.apache.org/

  2. Docker 镜象说明  https://hub.docker.com/r/egaillardon/jmeter

  3. http://www.testautomationguru.com/jmeter-distributed-load-testing-using-docker/

  4. 用Rancher进行Jmeter测试http://www.51testing.com/html/30/n-3726530.html

  5. 在 Kubernetes 上使用 Jmeter 运行压力测试 在上使用运行压力测试https://blog.csdn.net/wuxiaobingandbob/article/details/78683057(有一点老了,他用的Jmeter还是3.1版本,且DockerHub上的镜象也已经有好几年不更新了。)

  6. https://www.cnblogs.com/xiaowenshu/p/10455370.html

精彩回顾:

怼一下GitFlow吧

把SpringBoot的微服务放到K8S里(一)

把SpringBoot的微服务放到K8S里(二) - 微服务,装箱启航!

把SpringBoot的微服务放到K8S里(三) - ZipKin微服务链路跟踪

Hello World, DevOps. 第一部分:DEMO环境安装

Hello World, DevOps 第二部分:代码码起来,CI/CD跑起来

Hello World, DevOps 第三部分:在K8S中启航

GitLab CI/CD 简介

聊聊性能测试(六)- 集群怎么测

IT人员画像 - PM私董会201906次公益场会后知识点回顾

f273c03c239bf86b6b500b0a783c845f.png

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐