Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BCS压测(各组件接口压测) #3666

Open
yuyudeqiu opened this issue Jan 9, 2025 · 0 comments
Open

BCS压测(各组件接口压测) #3666

yuyudeqiu opened this issue Jan 9, 2025 · 0 comments
Assignees
Labels
feature new feature

Comments

@yuyudeqiu
Copy link
Contributor

yuyudeqiu commented Jan 9, 2025

feature相关背景与描述

为了弄清楚bcs的性能基线和部署容量,需要对bcs进行各模块组件压测及全链路压测。

  • 各组件分别压测:主要是对各组件在网关的常用接口获取各组件的性能基线,如获取cluster-resource组件在1c2g的部署资源下的qps、响应耗时、请求成功率、组件自身负载(cpu、内存、网络)等情况,之后递增部署资源进行压测,在这一阶段也可以梳理下组件的核心metrics,作为dashboard面板,便于监测
  • 全链路压测(优先级靠后,可能会和全链路灰度发布结合一起做):观察常用接口压测时,全链路各组件的性能情况,如bcs-apigw、user-manager、cluster-resource、storage、mongodb等,可用于发现全链路性能瓶颈点并进行优化改进及用于指导全链路的扩缩容
  • 同时考虑bcs压测的脚本化/工具化,能集成到ci流水线,也能在客户环境中复用,测出客户环境的bcs性能基线

解决方案描述

压测工具

以下方案仅针对各组件分别压测

根据多个压测工具的对比,最终选用 JMeter,理由如下:

  1. 支持图形化报告,压测完成后可以直接使用浏览器查看压测结果
  2. 支持插件,比如 Prometheus Listener 等插件,曝露 metrics 接口,便于将压测数据采集到监控平台,方便与其他指标(如内存、CPU、网络等)放到同一面板进行观测
  3. 支持变量化配置,可以将 url,api token 等,以及压测相关参数 duration,users 等通过配置文件挂载,方便的进行修改

对常用场景的接口进行压测,集群节点列表、查看集群集群列表、添加,删除集群资源等,详情参考这部分接口:BCS同步至蓝鲸网关到接口列表

压测构建流程

  1. 编辑 jmx 文件

    1. 创建用户自定义变量,用于做压测参数到配置如:线程数、持续时间、请求的base_url,bcs token等
    2. 创建线程组
      1. Setup 线程组,先做请求拿到后续压测需要的数据,如 projectID, helm 的 repo name,chart list 等
      2. 每个接口使用单独的线程组进行压测,每次只压测一个接口(勾选 Run Thread Groups consecutively)
      3. tearDown 线程组,对压测时产生的压测数据做清理,如 PUT 请求新增的数据(创建命名空间)等
    3. 创建 Prometheus Listener,用于曝露 metrics 接口,指标可以被采集
  2. 编辑 Dockerfile

    1. 使用 alpine/jmeter:5.6 作为基础镜像

    2. 通过 RUN curl 下载 Github 的 jmeter-prometheus-listener 插件

    3. ENTRYPOINT 指定仅运行 jmeter

    4. 其他的参数通过命令行参数指定如:

      docker run --rm \
        -v /tmp/bcs-test.jmx:/jmeter/bcs-test.jmx \
        -v /tmp/bcs_value.properties:/jmeter/bcs_value.properties \
        -v /tmp/results:/jmeter/results \
        test.yace:0.1 \
        -n -t /jmeter/bcs-test.jmx \
        -q /jmeter/bcs_value.properties \
        -l /jmeter/results/results.jtl \
        -e -o /jmeter/results/report
  3. 待压测完成后启动另一个镜像 Nginx,将压测报告的 HTML 文件放入,即可被访问

    docker run --rm -d \
      -v ~/Desktop/canway/tmp/yace/results/report:/usr/share/nginx/html:ro \
      -p 8080:80 \
      nginx:alpine

封装成 Helm Chart

为了方便在集群上进行压测,并且支持一键部署,以及将压测结果作为 metrics 指标被采集到监控平台,更方便的方式是将镜像包装成 Helm Chart 的形式,具体思路如下

  1. Deployment
    1. jmeter 使用压测的镜像,运行 jmeter 生成压测,同时曝露 9270 端口用于指标采集。完成压测后生成压测报告并使用 chmod 修改权限,使报告文件对 nginx 可读。完成压测后保持sleep,防止生命周期结束导致pod重启。
    2. 使用 nginx 镜像,挂载 jmeter 生成的压测报告,进行报告的展示和服务曝露,默认点的为 /usr/share/nginx/html
  2. ConfigMap
    1. 配置 JMeter 测试计划(.jmx 文件)和变量配置文件,使用 ConfigMap 存储,并挂载到 jmeter 镜像中,进行压测请可以读取配置运行。
  3. Service
    1. 为 nginx 提供服务,通过 NodePort 或 LoadBalancer 进行曝露,使用户可以通过节点 IP 访问报告。
    2. 为 jmeter 曝露 9270 端口,用于收集压测指标。

这样的 Helm Chart 将便于在集群上快速部署压测环境,并且具备报告的自动化曝露功能和压测指标采集能力。

不足

  1. HTML 的压测报告格式固定,无法在压测报告上看到压测是使用的参数,如:压测是的线程数,每个接口压测的时间等。以及压测需要的,需要手动记录下压测时配置的参数以及对应的报告结果。
  2. 如果需要调整参数,重新压测还需要,修改 Configmap 中的配置,再删除原来的 pod,等待重新运行完成,访问压测报告,操作复杂。
  3. 当前使用的 Prometheus Listener 不支持自定义指标,无法将qps等指标直接作为指标被采集,需要后续根据基础指标进行计算,并且计算结果与Jmeter的结果报告存在误差

其他可行性方案分析

将对各组件的压测作为做成一个插件,作为 cluster-reporter 的能力之一。cluster-reporter 本身已经暴露了 metrics 接口,压测指标可以通过 metrics 接口被采集,在监控平台中观测。插件开发可以使用 vegetago-stress-testing 压测工具提供了库级 api,可以在插件开发过程中直接引用。

另外也可以减少压测的配置,在 bcs 的 chart 中,一些配置可以模板化获取,如压测目标的 ClusterID,bcs api token等,都可以在 bcs 通过模板渲染时确定,减少手动修改的配置。

其他补充信息

按照上述思路完成 Helm Chart 构建后测试,当前仅展示完成几个简单接口的压测结果。

进入 jmeter 容器使用 curl localhost:9270/metrics 可以获取到指标数据

image

待压测完成之后,在本地使用 kubectl port-forward svc/bcs-stress-test-service 8080:80 -n bcs-system 可以在本地通过浏览器访问压测报告

image

如果只需要在本地进行压测,也可以将 jmx 文件下载下来,然后运行 jmeter 完成压测拿到压测报告。

./jmeter -n -t /tmp/bcs-test.jmx \
  -q /tmp/bcs_value.properties \
  -l /tmp/results.jtl \
  -e -o /tmp/report_dir
@yuyudeqiu yuyudeqiu added the feature new feature label Jan 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature new feature
Projects
None yet
Development

No branches or pull requests

2 participants