王诚强,荔枝微课基础架构负责人。热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者。

本文根据2021年4月10日深圳站举办的【腾讯云原生技术开发日】 线下活动中,【荔枝微课】基础架构负责人“王诚强”关于“基于kubernetes搭建分布式压测系统”的演讲整理而成。

关注【腾讯云原生】公众号后台回复【lzwk】,可获得该演讲PPT。

大家好,今天想和大家分享的主题是基于kubernetes搭建分布式压测系统。

从背景、原理、实现、效果和未来方向5个方面讲解了荔枝微课在基于 kubernetes 搭建分布式压测系统上的实践和思考。

背景

荔枝微课作为一个高速发展的平台,面临着业务流量越来越大的冲击,特别是在去年疫情期间遭遇成倍流量增长的情况,是通过什么方式轻松渡过难关的?以我在荔枝微课落地云原生的经历来说,为什么我们要去实践云原生架构呢?只是因为是业内技术趋势吗?

其实这个是源于业务需要的,基础架构最重要的是稳定高效,在我最早接手并负责荔枝微课基础架构时,第一个季度的目标居然是应急响应,但我们都知道应急响应是治标不治本的,而要治本根治的话那么就要对改掉整个底层基础架构,这也是为什么荔枝微课会去做云原生实践的原因。

而在做这个实践的时候,我们还需要一个工具来衡量,那就是分布式压测系统。我们早期使用过本地压测、CVM伸缩组压测等方案,但是他们有着本地资源能力有限、伸缩组申请变更麻烦、伸缩速度较慢、压测脚本和报告管理混乱,经常无存档等缺点。于是我们采用了现在的基于 kubernetes的分布式压测方案。

分布式压测方案借助的三个技术

原理上来讲,需要借助三方面的技术:

编程技术

这里我们选择了我们团队较熟悉的python,不同团队可以有不同的选择;

压测引擎

我们用的是Locust,因为它是用python写脚本,其实也可以更换成jmeter之类的其它压测引擎,

kubernetes

主要利用它的服务编排技术来进行一个资源上的调度,经过我们测试,如果是普通集群,在需要弹出集群物理节点的情况下,全部就绪需要90秒,但是使用弹性集群,则可以压缩到15~20秒,所以推荐使用弹性集群。

整个技术框架原理上,压测节点分为主节点(master)、从节点 (slave)和监控节点(monitor)三种类型:

主节点

负责任务管理和数据采集聚合,本身不进行压测任务

从节点

负责压测任务

监控节点

从主节点将结果通过webhook传递给web服务处理端;

另外这些节点的状态、日志都会通过k8s的api进行采集。

根据压测任务里主从节点所申请的资源,集群将提前伸缩好节点,并将任务分配到不同节点,以达到动态提高压测能力的目的。

压测流程

右边为用户所感知到的过程,压测集中包括多个压测场景,通过编写压测脚本和配置压测参数的方式生成压测任务,并最终生成压测报告。

左边为python控制集群来生成任务的过程,具体是渲染生成不同任务的yaml文件后,生成相应的 job pod,然后持续将 pod 状态 、日志和压测曲线结果反馈在页面上。

整个过程所使用的技术并没有多高深,主要是在集群应用上的一种探索。

实现方法

使用yaml编排job服务,举例slave节点来说,主要是声明一个job类型的工作负载,将生成的任务从节点名以及任务生成的命名空间渲染上去,然后设置我们的压测基础镜像以及启动命令,这里我们用到了 kubernetes 的几个技巧,一个是通过hostAliases进行内部解析,这样可以对一些内网代理进行压测,另一个是声明申请资源CPU,以便在任务启动前提前伸缩好物理节点提供资源,还有一个是通过configmap挂载可执行文件,这样可以注入参数在变化的启动命令,而不需要重新构建镜像。

然后说一下我们的代码框架,主要是分为这几个模块:

  • k8s模块,提供一些如创建销毁命名空间或pod、查看状态、拉取日志等api功能;
  • 基础镜像,较为简单,主要安装了一些基础通用的库,然后开通了一些内部使用的端口;
  • 任务编排声明文件,包括了我上面说的几种节点服务;
  • 任务核心方法类,主要是将上述的流程代码实现,提供了一些方法,这里限于篇幅就不具体展开了。

然后最后我们来看下效果:

这是我们压测系统的管理界面,现在看到的是压测集,方便集中管理。

这是创建压测场景,并基于该场景编写python压测脚本,并可设置我们的任务参数。

这是压测任务详情页,可以看到压测参数、状态以及节点情况和查看日志。

这是压测过程中实时生成的图表,可以基于图表情况进行分析。

未来改进方向

  • 引擎类型或版本允许选择更换;
  • 批量定时分阶段的自动压测计划;
  • 将所有涉及资源图表关联进来,形成更为详尽的报告;
  • 任务资源限制与使用审批;
  • 报告分析结论存档,相关问题追踪处理结果存档;
  • 相同条件的多次压测结果对比展示;
  • 使用更为云原生的方式管理任务的生命周期;

Q&A环节

Q:这个压测系统对于测试人员有什么要求吗?

A:需要会使用编程语言编写压测脚本,并有一定的分析思考能力,通过进一步封装的话也可以降低这部分的要求,但编程的话能力会更强更灵活,比如一些复杂条件或者像要动态使用账号的情况。

Q:你们的压测会需要多少资源呢,是怎么控制的呢?

A:我们这套系统,是根据任务需要自动申请资源的,任务结束时也就自动销毁了,不会出现说一直占用消耗资源的情况。

Q:这个对于服务在哪个云有要求吗?

A:虽然我刚才说到的集群是TKE的,但kubernetes作为一项开源的、通用的标准化技术,只要能提供该服务的云理论上都可以。

Q:你们压测会压生产吗?大概多久压一次?脏数据怎么办?

A:我们压测会在尽量不影响用户的情况下定期进行线上压测,大概是每月一次,新项目上线前也会在测试环境压,也有专门的压测集群来压,脏数据的话也是要清的,我们有机器人用户,可以针对这些用户进行脏数据清理。

Q:我们公司已经有用几台服务器来压测,想问下为什么要用kubernetes集群呢?

A:一方面我们当时刚好在做集群方面的实践,另一方面呢,也考虑了集群资源管理上的优势,比如资源隔离或限制,因为有的时候测试是不太清楚自己需要多少资源的,不加限制的话有的时候会占用比较多资源,还有就是任务状态、日志的收集还有就是我前面提到的一些集群的特性。

案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统的更多相关文章

  1. 实现理论上无tps上限的分布式压测(基于Jmeter+InfluxDB+Grafana+Spring Boot)

    JMeter自身带有Master-Slave压测框架,对于并发量不是很高的压力情况下(比如tps低于5000),该方案是可行的,并且使用起来非常方便,只要在配置文件或者命令行工具的参数做一些补充,即可 ...

  2. 基于kubernetes的分布式限流

    做为一个数据上报系统,随着接入量越来越大,由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机 ...

  3. Jmeter(四十七) - 从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)

    1.简介 千呼万唤始出来,这一篇感觉写了好久,总想写的清楚明白简洁,但是还是洋洋洒洒写了好多,希望大家喜欢吧!本来打算将这一篇文章是放在性能测试中讲解和分享的,但是有的童鞋或者小伙伴们私下问的太多了, ...

  4. jmeter分布式压测

    stop.sh需要跑Jmeter的服务器上安装Jmeteryum install lrzsz 安装rz.sz命令rz jemter的压缩包 拷贝到/usr/local/tools下面unzip apa ...

  5. 分布式压测系列之Jmeter4.0第一季

    1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...

  6. jmeter5.1分布式压测

    在使用jmeter压测过程中,可能会度遇到内存溢出的错误,这是为什么呢?因为jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然我们可以调整堆内存大小,但是单机无法支 ...

  7. JMeter分布式压测实战(2020年清明假期学习笔记)

    一.常用压力测试工具对比 简介:目前用的常用测试工具对比 1.loadrunner 性能稳定,压测结果及颗粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多. 2.Apache ab(单接口 ...

  8. jmeter 分布式压测(Linux)

    之前一篇博文写的是如何在Linux上使用jmeter压测,这篇介绍下Linux上jmeter的分布式压测. 和windows上的分布式类似,需要配置agent节点和控制机 一.Agent节点配置 1. ...

  9. jmeter 分布式压测(windows)

    单台压测机通常会遇到客户端瓶颈,受制于客户机的性能.可能由于网络带宽,CPU,内存的限制不能给到服务器足够的压力,这个时候你就需要用到分布式方案来解决客户机的瓶颈,压测的结果也会更加接近于真实情况. ...

随机推荐

  1. 全球首发—鸿蒙开源平台OpenGL

    目录: 前言 背景 鸿蒙OpenGL-ISRC的结构 OpenGL-ISRC和鸿蒙SDK OpenGL的区别 OpenGL-ISRC的使用 前言 基于安卓平台的OpenGL(androidxref.c ...

  2. 三万长文50+趣图带你领悟web编程的内功心法:一文带你深入解读HTTP的发展史

    看到题目,大家是不是认为根据上一篇(两万字长文50+张趣图带你领悟网络编程的内功心法)一样,其实不然,我们上一边介绍的是网络编程的基本功,有了这些基本功之后,我们就可以在此之上构建更加接近实际应用的w ...

  3. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...

  4. 分布式事务 SEATA-1.4.1 AT模式 配合NACOS 应用

    SEATA 配置 目录 SEATA 配置 TC (Transaction Coordinator) - 事务协调者 配置参数 nacos bash 脚本 同步 config 配置到 nacos 使用 ...

  5. 二分图最小点覆盖构造方案+König定理证明

    前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 \(Dinic\) 算法进行实现,时间复杂度为 \(O(n\sqrt{e})\),其中, \(n\)为二分图中左部点的数量, ...

  6. Oracle check TBS usage

    select d.tablespace_name, space||'M' "SUM_SPACE(M")", blocks "SUM_BLOCKS", ...

  7. Python3.x 基础练习题100例(11-20)

    练习11: 题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析: 兔子的规律为数列1,1,2, ...

  8. Linux 切换 shell

    查看当前已安装的shell [root@CentOSv64 my]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tc ...

  9. Hadoop的常用命令

    注:hadoop的使用命令包含 hadoop fs 开头 or hdfs dfs开头 等多种形式来操作. 这里以hadoo fs的形式来介绍在这些命令 1.列出根目录下所有的目录或文件 hadoop ...

  10. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...