菜单
文档breadcrumb arrow Grafana k6breadcrumb arrow 设置breadcrumb arrow 设置分布式 k6breadcrumb arrow 用法breadcrumb arrow 使用 TestRun CRD 运行 k6 脚本
开源

使用 TestRun CRD 运行 k6 脚本

本指南介绍如何配置 k6 脚本以使用 k6 Operator 运行。

定义测试脚本

有几种方法可以在 TestRun CRD 中配置脚本。Operator 使用 configMapvolumeClaimlocalFile 为任务提供测试脚本。

ConfigMap

配置脚本的主要方式是创建一个包含脚本内容的 ConfigMap

bash
kubectl create configmap my-test --from-file /path/to/my/test.js

然后在 TestRun 中指定它

bash
  script:
    configMap:
      name: my-test
      file: test.js

注意

单个 ConfigMap 的字符限制为 1048576 字节。如果您需要更大的测试文件,则必须使用 volumeClaimlocalFile 代替。

VolumeClaim

如果您有一个名为 stress-test-volumeClaim 的 PVC 包含您的脚本和任何其他支持文件,您可以像这样将其传递给测试

yaml
spec:
  script:
    volumeClaim:
      name: 'stress-test-volumeClaim'
      # test.js should exist inside /test/ folder.
      # All the js files and directories test.js is importing
      # should be inside the same directory as well.
      file: 'test.js'

Pod 将期望在 /test/ 文件夹中找到脚本文件。如果 volumeClaim 失败,这是首先要检查的地方。最新的初始化 Pod 不会生成任何日志,并且在找不到文件时会退出并出现错误。有关潜在的改进,请参阅此 GitHub 问题

示例目录结构

├── test
│   ├── requests
│   │   ├── stress-test.js
│   ├── test.js

在前面的示例中,test.jsstress-test.js 导入一个函数,这些文件看起来像这样

js
// test.js
import stressTest from './requests/stress-test.js';

export const options = {
  vus: 50,
  duration: '10s',
};

export default function () {
  stressTest();
}
js
// stress-test.js
import { sleep, check } from 'k6';
import http from 'k6/http';

export default () => {
  const res = http.get('https://quickpizza.grafana.com');
  check(res, {
    'status is 200': () => res.status === 200,
  });
  sleep(1);
};

LocalFile

如果脚本存在于自定义运行器镜像的文件系统中,可以使用 localFile 选项访问它

yaml
spec:
  parallelism: 4
  script:
    localFile: /test/test.js
  runner:
    image: <custom-image>

注意

如果您的集群在使用 volumeClaim 方面存在任何限制,您可以使用 localFile 选项。如果可能,我们建议使用 volumeClaim

多文件测试

如果您的 k6 脚本拆分到多个 JavaScript 文件中,您可以创建一个包含多个数据条目的 ConfigMap,如下所示

bash
kubectl create configmap scenarios-test --from-file test.js --from-file utils.js

如果要手动指定的文件太多,使用带文件夹的 kubectl 也可能是一种选择

bash
kubectl create configmap scenarios-test --from-file=./test

此外,您还可以使用 k6 创建一个存档文件

bash
k6 archive test.js [args]

k6 archive 命令在当前文件夹中创建 archive.tar。然后您可以在 configmap 中使用该文件,类似于 JavaScript 脚本

bash
kubectl create configmap scenarios-test --from-file=archive.tar

如果您使用存档文件,则必须编辑 TestRun 部署的 YAML 文件,以便将 file 选项设置为 k6 run 命令的正确入口点

yaml
# ...
spec:
  script:
    configMap:
      name: 'crocodile-stress-test'
      file: 'archive.tar' # <-- change here

运行测试

通过将自定义资源 TestRun 应用到运行 k6 Operator 的集群来执行测试。TestRun CRD 的其他可选属性允许您控制分布式执行的一些关键方面。例如:

yaml
# k6-resource.yml

apiVersion: k6.io/v1alpha1
kind: TestRun
metadata:
  name: k6-sample
spec:
  parallelism: 4
  script:
    configMap:
      name: k6-test
      file: test.js
  separate: false
  runner:
    image: <custom-image>
    metadata:
      labels:
        cool-label: foo
      annotations:
        cool-annotation: bar
    securityContext:
      runAsUser: 1000
      runAsGroup: 1000
      runAsNonRoot: true
    resources:
      limits:
        cpu: 200m
        memory: 1000Mi
      requests:
        cpu: 100m
        memory: 500Mi
  starter:
    image: <custom-image>
    metadata:
      labels:
        cool-label: foo
      annotations:
        cool-annotation: bar
    securityContext:
      runAsUser: 2000
      runAsGroup: 2000
      runAsNonRoot: true

使用此命令创建 TestRun CR:

bash
kubectl apply -f /path/to/your/k6-resource.yml

清理资源

完成测试运行后,您需要清理创建的测试任务

bash
kubectl delete -f /path/to/your/k6-resource.yml

此外,您可以使用 cleanup 选项配置资源的自动删除

yaml
spec:
  cleanup: 'post'

设置 cleanup 选项后,k6 Operator 会在测试运行结束后删除 TestRun CRD 和所有创建的资源。