压力测试是用来检测系统承载能力的有效手段。在系统规模较小的时候,在一台空闲的服务器上使用[ab],[wrk],[siege]等工具发起一定量的并发请求即可得到一个初步的测试结果。但在系统复杂度逐步提高,特别是引入了负载均衡,微服务等架构后,单机的压力测试方案不再可用,企业需要搭建分布式测试集群或者付费使用外部供应商提供的压力测试服务。

不管是采取自主搭建或是采用外购的手段,都会面临系统使用率不高以及成本的问题。基于Kubernetes的动态资源调度功能,以及Kubernetes集群的动态伸缩特性,我们可以充分利用集群内的闲置计算资源,在需要进行压力测试时启动测试节点,在测试结束后释放资源给其他业务,甚至通过集群扩容和缩容临时为压力测试提供更多的计算资源。

支持分布式部署的压力测试工具有多款,今天我们将介绍在Kubernetes集群中使用Tsung进行压力测试的方法。

Tsung

[Tsung]是一款使用[Erlang]开发的分布式压力测试系统,它支持HTTP,Jabber,MySQL等多种协议,可以用于不同场景的压力测试。与传统的针对单一测试目标重复请求的压测系统不同,Tsung更侧重于模拟真实使用场景。测试人员指定新用户到访频率,并设定一系列的模拟操作请求。所有的Slave节点将在Master节点的统一调度下,按照到访频率创建虚拟用户,并发送操作请求。
所有请求的耗时以及错误信息将传回Master节点用于统计和报表。

选择Tsung主要有三方面的考虑:

  • 性能优越。Erlang语言天生就是为高并发网络系统设计的。合理配置的Tsung集群可以实现100W以上的并发流量。
  • 描述式的配置方法。不论简单还是复杂,Tsung均统一使用XML文件描述整个测试步骤以及各种参数。这样可以在集群架构保持不变时完成各种测试。
  • 模拟真实用户的测试理念。在真实场景中,用户会访问系统的各项功能。只有支持模拟真实用户的压力测试系统才能比较准确的反应系统各个部分在压力下的状态,找到瓶颈环节。

由于Tsung采取的工作模式是在配置中注明Slave地址,然后由Master连上Slave完成测试,传统的部署方法是启动多台物理机或者虚拟机,分别配置它们。在这种工作模式下,会产生大量的运维工作,同时这些计算资源在不进行测试时处于闲置状态,降低了硬件使用率。

在Kubernetes中使用容器运行Tsung

利用Kubernetes强大的调度能力,我们可以将Tsung运行在容器当中,动态的启动和删除。当需要提高测试规模时,我们仅需要使用[Archon]等已有的工具对集群进行扩容,就可以很方便的一键扩容Slave的数量,几乎没有带来任何的运维负担。

以下是具体的操作流程:

创建Namespace

$ kubectl create namespace tsung

使用StatefulSet部署Tsung Slave

这里不能使用Deployment,只有使用StatefulSet才能在为每一个Pod分配独立的内部域名,供Master连接。

将以下文件保存为tsung-slave-svc.yaml

apiVersion: v1
kind: Service
metadata:labels:run: tsung-slavename: tsung-slave
spec:clusterIP: Noneselector:run: tsung-slaveports:- port: 22type: ClusterIP

将以下文件保存为tsung-slave.yaml

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:name: tsung-slave
spec:serviceName: "tsung-slave"replicas: 1template:metadata:labels:run: tsung-slavespec:containers:- name: tsungimage: ddragosd/tsung-docker:1.6.0env:- name: SLAVEvalue: "true"

在Kubernetes中创建相应的资源

$ kubectl create -f tsung-slave-svc.yaml --namespace tsung
$ kubectl create -f tsung-slave.yaml --namespace tsung

这里我们设置了StatefulSetserviceName字段,这样启动的Pod在集群内部就可以通过tsung-slave-0.tsung-slave.tsung.svc.cluster.local
这个域名访问到。

使用StatefulSet部署Tsung Master

与Slave类似,Master节点也要求可以在集群内部通过域名访问。所以我们依然需要使用StatefulSet来运行。

将以下文件保存为tsung-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: tsung-config
data:config.xml: |<?xml version="1.0" encoding="utf-8"?><!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd" []><tsung loglevel="warning"><clients><client host="tsung-slave-0.tsung-slave.tsung.svc.cluster.local" /></clients><servers><server host="target" port="8000" type="tcp"/></servers><load><arrivalphase phase="1" duration="1" unit="minute"><users arrivalrate="100" unit="second"/></arrivalphase></load><sessions><session name="es_load" weight="1" type="ts_http"><for from="1" to="10" incr="1" var="counter"><request> <http url="/" method="GET" version="1.1"></http> </request></for></session></sessions></tsung>

将以下文件保存为tsung-master-svc.yaml

apiVersion: v1
kind: Service
metadata:labels:run: tsung-mastername: tsung-master
spec:clusterIP: Noneselector:run: tsung-masterports:- port: 8091sessionAffinity: Nonetype: ClusterIP

将以下文件保存为tsung-master.yaml

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:name: tsung-master
spec:serviceName: "tsung-master"replicas: 1template:metadata:labels:run: tsung-masterspec:containers:- name: tsungimage: ddragosd/tsung-docker:1.6.0env:- name: ERL_SSH_PORTvalue: "22"args:- -k- -f- /tsung/config.xml- -F- startvolumeMounts:- mountPath: /tsungname: config-volumevolumes:- configMap:name: tsung-configname: config-volume

在Kubernetes中创建相应的资源

$ kubectl create -f tsung-config.yaml --namespace tsung
$ kubectl create -f tsung-master-svc.yaml --namespace tsung
$ kubectl create -f tsung-master.yaml --namespace tsung

当Tsung Master的容器被启动后,它会自动开始运行压力测试。在上面的列子中,Tsung将向http://target:8000发起为期1分钟的压力测试,在测试期间,每秒钟产生100个模拟用户,每个用户访问10次目标地址。

我们将Tsung的配置文件用ConfigMap注入到了Master容器当中,这样用户仅需要修改tsung-config.yaml的内容,就可以方便的定义符合自己要求的测试。在实际使用过程中,用户可以自主调整测试持续时间,虚拟用户产生速度,目标地址等参数。用户还可以通过修改tsung-slave.yamlreplicas的数值,并将更多的Slave地址加入到tsung-config.yaml当中,来获得更多的测试资源,进一步增加负载量。

在Master的运行参数中,我们使用的-k参数将使得Master在测试完成后仍处于运行状态,这样用户可以通过8091端口访问到测试结果。

$ kubectl port-forward tsung-master-0 -n tsung 8091:8091

之后在本地通过浏览器访问http://localhost:8091即可打开Tsung内置的报表界面。如下图所示:

另外-F参数让Master使用FQDN地址访问Slave节点,这项参数非常关键,缺少它将导致Master无法正常连接上Slave。

资源回收

测试结束后,用户可以使用报表界面查看和保存结果。当所有结果被保存下来之后,可以直接删除Namespace完成资源回收。

$ kubectl delete namespace tsung

这样所有的Tsung相关配置和容器均会被删除。当下次需要测试时,可以从一个全新的状态开始新一次测试。

总结

本文主要介绍了在Kubernetes中部署Tsung这款分布式压力测试系统的方法。其中使用StatefulSet配合-F参数的方法,使得Master和Slave可以顺利的使用域名找到对方,成功的解决了在容器中运行Tsung会遇到的访问问题。

原本需要专业的运维工程师投入不少时间才能搭建起来的Tsung测试集群,在Kubernetes中几乎可以毫不费力的启动起来,完成测试。这种使用调度器充分利用集群空闲资源,使用后及时释放供其他系统使用的方法,也充分体现了Kubernetes的优越性。

在下一篇分享中,我们将使用本文所描述的测试系统,对主流的Python WSGI服务器进行压力测试,用以对比各个服务器的性能指标。希望通过这种实战演示的方式,帮助大家深入了解Tsung以及Kubernetes。敬请期待。

基于Kubernetes的分布式压力测试方案相关推荐

  1. 案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统

    王诚强,荔枝微课基础架构负责人.热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者. 本文根据2021年4月10日深圳站举办的[腾讯云 ...

  2. .net分布式压力测试工具(Beetle.DT)

    肯定有人会问为什么会写这样一个开源工具?和现有的有什么差别?不过对于一个程序员来说写东西还真不需要理由的:),主要原因是工作有点闲(开玩笑),不过说实话一个程员怎可能会停止写代码呢(作为一个奔4的程序 ...

  3. Katta:基于Lucene可伸缩分布式实时搜索方案

    http://www.ij2ee.com/2011/11/29/katta%EF%BC%9A%E5%9F%BA%E4%BA%8Elucene%E5%8F%AF%E4%BC%B8%E7%BC%A9%E5 ...

  4. 唯品会基于Kubernetes(k8s)网络方案演进

    VIP PaaS在接近两年时间里,基于kubernetes主要经历四次网络方案的变迁: 1. kubernetes + flannel 2. 基于Docker libnetwork的网络定制 3. k ...

  5. 压力测试到底测什么?压力测试方案是什么?

    云计算时代,企业对于应用性能要求倍显严格.如何保障企业应用高效运行,压力测试环节必不可少,那么压力测试到底测什么?如何制定适合自己都压力测试方案呢? 首先,进行总体测试规划,规划集成测试的目的.测试时 ...

  6. WEB网站压力测试方案 压力测试如何换算并发用户数

    http://wenku.baidu.com/view/bedf1a93daef5ef7ba0d3c29.html 压力测试通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大的服务级别 ...

  7. k8s网络架构图_唯品会基于Kubernetes(k8s)网络方案演进

    VIP PaaS在接近两年时间里,基于kubernetes主要经历四次网络方案的变迁: 1. kubernetes + flannel 2. 基于Docker libnetwork的网络定制 3. k ...

  8. 基于 Websocket 协议的压力测试

    背景 最近客户端实现了一个基于websocket的消息推送功能:长连接网络开关下发开后启动,然后保持链接,每隔15分钟发一次心跳包,服务器有数据时直接下发生效,因此需要对服务器进行压测. 本次通过写p ...

  9. Jmeter分布式压力测试

    安装 下载地址:http://jmeter.apache.org/download_jmeter.cgi 安装前提(因为jmeter依赖于java所以必须先配置好java) 下载后解压: tar -x ...

最新文章

  1. 如何将github上源代码导入eclipse中
  2. arcgis python编程案例-面向ArcGIS的Python脚本编程
  3. 《java编程思想》读后笔记:二,吸血鬼数字
  4. JavaScript的特殊函数
  5. Scrapy项目 - 数据简析 - 实现腾讯网站社会招聘信息爬取的爬虫设计
  6. 调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付
  7. 产品管理职位的级别都有哪些
  8. Java 12 - Java StringBuffer和StringBuilder类
  9. IEEE EDGE 2020论文:Astraea — 以优雅的方式在边缘部署AI服务
  10. java ocsp请求_java – 客户端证书上的OCSP吊销
  11. JAVA刻度_java – 对数轴标签/刻度定制
  12. hibernate缓存理解
  13. 8,EasyNetQ-多态发布和订阅
  14. 网吧用电影服务器系统,网吧流媒体电影服务器搭建的解决方案
  15. 微信公众号注册免费教程
  16. android 播放滴一声
  17. 地图省界线什么样_echarts geo 下的regions 单独修改地图省份界线样式与颜色
  18. JavaScript---开通QQ在线客服
  19. javascript:幂指数运算符
  20. java 小数点左移_规格化数尾数左移解决什么问题

热门文章

  1. java非递归_Java非递归文件系统走路
  2. db2 语句包括不必要的列表_DB2 SQL0956C 数据库堆中没有足够的处理空间可用来处理此语句...
  3. opencv 的norm_22、OpenCV用卷积Filter2D进行滤波器
  4. ajax定时器怎么写,js定时器怎么写?就是在特定时间执行某段程序
  5. android iOS 都精通,Android IOS开发要理解何为面向对象的思维
  6. 4 插件模块_设计师必备的ps插件推荐
  7. 站怎么点都是一样_抖音怎么做?这几样一样都不能少,你都做到了吗?
  8. Javaweb MVC设计模式、Modle发展史、项目分层和三层架构
  9. for-each循环的认识、定义、适用对象、举例、局限性
  10. VMware Workstation虚拟机窗口小,无法显示内部系统全部桌面