5 月 20 日,MeterSphere 开源持续测试平台发布 v1.20.3-lts 版本。在这一版本中,MeterSphere 支持使用 Deployment 方式创建 Kubernetes 类型的资源池。
除了传统的添加一台独立主机作为测试资源池外,在 MeterSphere 的 X-Pack 功能增强包中,还支持 Kubernetes(K8s)类型的资源池。通过这种方式我们可以达到更大的并行测试规模,或者将不同团队使用的资源池区分开来,避免互相影响。
接下来我们将详细介绍接口测试及性能测试在 Kubernetes 集群中的执行流程, 以及 Kubernetes 类型的资源池应该如何配置使用。
在 Kubernetes 资源池中执行接口测试
在 Kubernetes 资源池中执行性能测试
Kubernetes 集群中的具体操作
首先我们需要一个 Kubernetes 集群,以及一个有相应资源创建权限的用户。如果还没有 Kubernetes 集群的小伙伴,可以考虑使用 KubeOperator(https://github.com/KubeOperator/KubeOperatorKubernetes 集群。)这个开源项目快速部署一个
在我们有了 Kubernetes 集群且能正常使用 kubectl 命令之后,需要先创建一个单独的 Namespace,名为 “ms-pool”,后续创建的所有资源均在该 Namespace 中。
ubectl create ns ms-pool
接下来,我们需要创建有对应权限的 ServiceAccount 供 MeterSphere 调用 Kubernetes 接口使用。
■ 创建 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: metersphere
namespace: ms-pool
■ 创建绑定给 ServiceAccount 的 Role
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: metersphere
namespace: ms-dev
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- watch
- list
- create
- update
- patch
- delete
- exec
- apiGroups:
- ""
resources:
- pods/exec
verbs:
- get
- create
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- watch
- list
- apiGroups:
- apps
resources:
- daemonsets
verbs:
- get
- watch
- list
- create
- update
- patch
- delete
- apiGroups:
- batch
resources:
- jobs
verbs:
- get
- watch
- list
- create
- update
- patch
- delete
■ 创建 RoleBinding,为 ServiceAccount 添加权限
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: metersphere
namespace: ms-pool
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: metersphere
subjects:
- kind: ServiceAccount
name: metersphere
namespace: ms-pool
■ 获取 ServiceAccount 的 Token
export NAMESPACE=ms-pool
export TOKENNAME=$(kubectl -n $NAMESPACE get serviceaccount/metersphere -o jsonpath='{.secrets[0].name}')
export TOKEN=$(kubectl -n $NAMESPACE get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode)
echo $TOKEN
接下来,创建执行接口测试需要使用到的 Node-Controller。具体的创建方式可以是 Deployment 或者 DaemonSet,只要能够产生 Node-Controller 的 Pod 就可以。
■ 使用 Deployment 方式创建
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ms-node-controller
name: ms-node-controller
namespace: ms-pool
spec:
selector:
matchLabels:
app: ms-node-controller
replicas: 2
template:
metadata:
labels:
app: ms-node-controller
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ms-node-controller
topologyKey: kubernetes.io/hostname
weight: 100
containers:
- env:
image: registry.cn-qingdao.aliyuncs.com/metersphere/ms-node-controller:dev
imagePullPolicy: IfNotPresent
name: ms-node-controller
ports:
- containerPort: 8082
protocol: TCP
resources: {}
volumeMounts:
- mountPath: /opt/metersphere/logs
name: metersphere-logs
restartPolicy: Always
volumes:
- emptyDir: {}
name: metersphere-logs
类似地也可以使用 DaemonSet 来提供 Node-Controller。上面使用到的 Role 以及 Deployment 和 DaemonSet 模板,都可以在 MeterSphere 平台的如下位置进行下载。
MeterSphere 平台上的具体操作
Kubernetes 集群中各个资源都创建成功后,就可以在 MeterSphere 平台上添加 Kubernetes 测试资源池了。在 MeterSphere 的 “系统设置”→“测试资源池管理” 页面中,新建一个 Kubernetes 类型的资源池。
填入所使用的 Kubernetes 集群 API 地址、对应的 Namespace 名字、获取到的 ServiceAccount 的 Token,以及提供 Node-Controller Pod 的 Deployment 或 DaemonSet 的名字。
信息都填写完毕后点击 “确定” 按钮保存,MeterSphere 会去验证填写的信息是否正确。如果在资源池列表查看到新建的资源池为启用状态,说明验证成功。后续接口测试及性能测试的执行就可以选择该资源池了。
创建资源池的时候参数比较多,以下简单说明一下选择 Kubernetes 资源池时每个参数的作用:
■ 镜像:使用该资源池执行性能测试时,用于创建 JMeter Pod 使用的镜像;不填写时,默认使用后台配置文件中的 jmeter.image 参数;
■ 后置监听器(X-Pack):使用该资源池执行性能测试时,是否使用 JMeter 后置监听器来汇总发送结果数据;开启时,使用 JMeter 中的 Kafka Backend Listeners 来收集并上传结果,使用 DataStreaming 计算处理;关闭时,使用外置的 Java 应用汇总处理结果数据并上传;
■ 用途:该资源池可以用于何种类型的测试;
■ JMeter HEAP:创建 JMeter Pod 时,使用的 JVM HEAP 参数;
■ JMeter GC_ALGO:创建 JMeter Pod 时,使用的 JVM GC_ALGO 参数;
■ 类型:测试资源池底层资源类型,独立节点或 Kubernetes;
■ Master URL:Kubernetes API 服务地址;
■ Token:调用 Kubernetes API 时使用的 Token;
■ Namespace:Kubernetes 相关资源的所属 Namespace;
■ Deploy Name:使用该资源池执行接口测试时,提供 Node-Controller Pod 的 Deployment 或 DaemonSet 的名称;
■ API Image:创建 Node-Controller Pod 使用的镜像名称;不填写时,默认使用后台配置文件中的 k8s.node-controller-image 参数;
■ 最大并发数:使用该资源池执行性能测试时,能支持的最大并发数限制;
■ 单 Pod 最大线程数:使用该资源池执行性能测试时,每个 Pod 支持的最大并发数;启动的 Pod 个数=总并发数/该参数;
■ 定时同步 Jar:是否定时同步用户上传的 Jar 包到资源池中的 Node-Controller 节点上。