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

MeterSphere · 2022年05月20日 · 最后由 小鹏友 回复于 2022年05月23日 · 6566 次阅读

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

共收到 1 条回复 时间 点赞
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册