在MeterSphere平台添加并使用Kubernetes资源池

发布于 2022年05月20日

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/KubeOperator)这个开源项目快速部署一个Kubernetes集群。

在我们有了Kubernetes集群且能正常使用kubectl命令之后,需要先创建一个单独的Namespace,名为“ms-pool”,后续创建的所有资源均在该Namespace中。

kubectl 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-pool
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
  - deployments
  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节点上。