Skip to main content

Command Palette

Search for a command to run...

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

Updated
3 min read

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

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

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts