用 k6 Operator 在 Kubernetes 上运行分布式负载测试
来源:Grafana k6 官方文档《Running distributed tests》,页面没有个人署名。核验时文档导航显示 k6 文档 v2.3.x(latest),日期 2026-10-08。以下命令和配置仅作静态阅读,未连接集群或执行测试。
当单台机器无法产生目标负载、测试需要来自多个 IP 的请求,或团队已用 Kubernetes 管理测试基础设施时,k6 Operator 可把一次测试拆分到多个 runner Pod。Operator 定义 TestRun 自定义资源,观察资源变化并创建、更新测试 Job,因此创建 TestRun 会修改集群状态。

先安装 Operator,并固定操作范围
原文通过从 k6-operator 的 main 分支下载 bundle.yaml 并直接提交给 kubectl apply 来安装。这种写法下载的是可变分支清单,且会在当前 Kubernetes 上下文创建资源。实际操作前,应核验 kubectl context、目标命名空间、权限与清单内容,并固定到经审查的 release 版本。
# 原文的安装形式,仅供识别其副作用;不建议对 main 分支清单直接管道执行
curl https://raw.githubusercontent.com/grafana/k6-operator/main/bundle.yaml | kubectl apply -f -
原文示例将 Operator 安装到 k6-operator-system 命名空间,并用以下只读命令查看 Pod:
kubectl get pod -n k6-operator-system
文档中的预期示例状态为 controller-manager Pod 的 2/2 容器处于 Running,RESTARTS 为 0。这个输出来自文档示例,不是本次安装或环境检查的结果。
准备测试脚本
文档从一个简短 k6 脚本开始:10 个虚拟用户持续运行 10 秒,循环访问示例站点并等待 1 秒。
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 10,
duration: '10s',
};
export default function () {
http.get('https://test.k6.io/');
sleep(1);
}
原文建议先在本地运行 k6 run test.js 检查脚本,并展示成功运行后的 summary。这会产生对目标站点的请求;本次没有执行,也没有把原文的示例输出当作实测结果。用于真实系统时,应先限定目标、速率、并发和测试时段,避免对生产服务造成意外负载。
将脚本提供给集群
脚本可以放在 ConfigMap,也可以放在挂载的持久卷中。创建 ConfigMap 的命令和文档输出是:
kubectl create configmap my-test --from-file test.js
# 文档预期输出:configmap/my-test created
Kubernetes 对 ConfigMap 数据总量限制为 1 MiB。更大的脚本或模块可放到 PersistentVolumeClaim;Operator 要求脚本位于卷内的 /test/ 目录。PVC 与 TestRun 必须位于同一命名空间。
定义 TestRun 与并行度
下面是从 ConfigMap 读取脚本的来源示例。这个自定义资源使用 k6.io/v1alpha1 API;应用前先确认 Operator 版本与 CRD 兼容。
apiVersion: k6.io/v1alpha1
kind: TestRun
metadata:
name: run-k6-from-configmap
spec:
parallelism: 4
script:
configMap:
name: my-test
file: test.js
parallelism 决定分配多少 runner Pod。脚本 ConfigMap 与 TestRun 必须处于同一命名空间;若从卷读取,script.volumeClaim.name 指向已存在的 PVC,file 相对卷内 /test/ 路径。
传入变量与命令行参数
TestRun 的 runner.env 可设置每个 runner 的变量,envFrom 可以引用 ConfigMap 或 Secret。账号、访问令牌等敏感值应通过 Secret 或外部密钥系统提供,不应写入 ConfigMap、脚本或日志。
runner:
env:
- name: REGION
value: staging
envFrom:
- configMapRef:
name: my-config-vars
- secretRef:
name: my-secrets-vars
脚本通过 k6 的环境变量接口读取值,例如 __ENV.REGION。测试选项也可以从 TestRun 的 arguments 传入:
arguments: --tag testid=run-k6-with-args --log-format json
原文还展示实时 Prometheus Remote Write 输出,并用 cleanup: post 在测试完成后清理资源。自动清理前应确认结果已写入外部存储;若结果只在 Pod 或集群资源中,先清理可能让排障材料不可用。
运行、排错与清理
把清单应用到运行 Operator 的集群,会启动负载测试;删除清单则会删除其指向的测试资源。两个命令都会改变集群状态:
kubectl apply -f /path/to/your/k6-resource.yaml
kubectl delete -f /path/to/your/k6-resource.yaml
排错时先看 TestRun 与 runner Pod 状态,再查 k6-operator troubleshooting guide 和社区讨论。使用远程输出时核验写入目标、凭据范围和后端成本。测试会向被测系统真实发流量,外部监控和集群用量可能另计。
适用范围与验证边界
本文按 Grafana 文档 v2.3.x 当前版本核对,并保留其中 k6-operator API 示例。安装示例使用 main 分支是文档中的可变引用;本文明确要求采用经审查的固定 release。静态检查了远程安装、TestRun、Secret 引用、压测流量和清理路径;没有安装 Operator、创建资源、启动 k6、运行命令或访问目标服务。配置在目标集群中的实际兼容性仍需按部署版本验证。
来源与版权:Grafana k6 官方文档《Running distributed tests》,检索于 2026-10-08。Grafana Labs 文档保留版权;中文译写按取得的授权发布。











暂无评论内容