基于Kubernetes的分布式压力测试方案

压力测试是用来检测系统承载能力的有效手段。在系统规模较小的时候,在一台空闲的服务器上使用[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内置的报表界面。如下图所示:

tsung_report

另外-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。敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旋转数组 java_数组中左旋转的Java程序

旋转数组 javaLet’s take an array a[3,4,5,1,0] here we can see after 1 rotation the position of the array element will be a [4,5,1,0,3], after 2 left rotations a[5,1,0,3,4] and so on hence we can see after d rotation the position of the ith element will be…

The output path is not specified for module XXX

新建项目启动时候&#xff1a;The output path is not specified for module XXX 没有为模块XXX指定输出路径。 解决方案 第一步 第二步 第三步

erwin模型导入mysql_使用erwin进行mysql建模

1,定义数据字典&#xff0c;把需要用到的数据类型创建好2&#xff0c;在物理模式下&#xff0c;设置数据字典&#xff0c;修改comment为%AttName这样会默认使用逻辑模式下&#xff0c;实体属性的名称作为字段的注释3&#xff0c;物理模式下选择database->pre & post scr…

EditText焦点问题

1、在一个Activity中加入一个EditText后&#xff0c;每次进入这个Activity时输入法都会自己主动弹出来。非常烦&#xff0c;找了些资料&#xff0c;在此记下解决的方法&#xff1a; 方法&#xff1a;在EditText的父控件中获得焦点。这样焦点就不会自己主动跑到EditText上了。 代…

stl中copy()函数_std :: copy()函数以及C ++ STL中的示例

stl中copy()函数C STL std :: copy()函数 (C STL std::copy() function) copy() function is a library function of algorithm header, it is used to copy the elements of a container, it copies the elements of a container from given range to another container from…

phpmyadmin管理mysql_用phpMyAdmin管理MySQL数据库_MySQL

phpmyadmin学会使用基于Web数据库的管理工具phpMyAdmin。如果使用合适的工具&#xff0c;MySQL数据库的管理就会为得相当简单。应用MySQL命令行方式需要对MySQL知识非常熟悉&#xff0c;对SQL语言也是同样的道理。不仅如此&#xff0c;如果数据库的访问量很大&#xff0c;列表中…

Linux网络那点事

跨平台系列汇总&#xff1a;http://www.cnblogs.com/dunitian/p/4822808.html#linux 之前的之前说过网络自连接的配置&#xff08;CentOS服务器网络配置&#xff1a;http://www.cnblogs.com/dunitian/p/4975830.html&#xff09;&#xff0c;这次和这个类似 这种方法适用于Cent…

机器学习中的马尔可夫随机场模型

马尔可夫随机场 (Markovs Random Fields) Markov random model is a model which use an undirected graph. Undirected graphical models edge represents the potential between two variables, syntactically, Factorization distribution probabilities between variable. …

python爬虫反爬 css 知乎 专栏_反反爬虫系列(四)

过完年&#xff0c;好了&#xff0c;咱们接着更新反反爬虫系列至于之前有朋友表示出一下1688呀&#xff0c;x宝的反反爬虫说实在的&#xff0c;阿里系的反爬虫很厉害&#xff0c;我自愧不能搞定。比如x宝的登录&#xff0c;用了selenium chrome的朋友都会遇到滑条拖动验证失败…

javaweb中mysql数据库的回滚操作代码

2019独角兽企业重金招聘Python工程师标准>>> 在mysql中创建用户账户数据库&#xff08;注意&#xff0c;count不能为负数&#xff0c;要设置无符号型&#xff09; 添加数据 下面我们得到connection对象开始进行事务提交和回滚的操作 package com.lyb.test; import s…

ruby array_Ruby中带有示例的Array.shuffle方法

ruby arrayArray.shuffle方法 (Array.shuffle Method) In this article, we will study about Array.shuffle method. You all must be thinking the method must be doing something which is related to shuffling of elements or objects in the Array instance. It is not …

【147天】尚学堂高淇Java300集视频精华笔记(108-109)

第108集:容器equals和hashcodeJDK源代码分析 本集知识点 Java中规定&#xff0c;若两个对象equals比较后内容相等&#xff08;为true&#xff09;&#xff0c;则hashCode必须相等&#xff0c;反之不然。【原因见内存分析图】hashCode与equals方法必须同时重写&#xff0c;且必须…

ruby hash方法_Ruby中带有示例的Hash.key?(obj)方法

ruby hash方法Hash.key&#xff1f;(obj)方法 (Hash.key?(obj) Method) In this article, we will study about Hash.key?(obj) Method. The working of the method cant be assumed because of its quite a different name. Let us read its definition and understand its …

python迭代器与生成器答案_史上最全 Python 迭代器与生成器

原标题&#xff1a;史上最全 Python 迭代器与生成器作者&#xff1a;浪子燕青链接&#xff1a;http://www.langzi.fun/迭代器与生成器.html迭代器与可迭代对象概念迭代器&#xff1a;是访问数据集合内元素的一种方式&#xff0c;一般用来遍历数据&#xff0c;但是他不能像列表一…

[性能测试] LoadRunner结果分析 – TPS

本文转载自&#xff1a;http://www.tuicool.com/articles/6z6vuy针对吞吐率和 TPS 的关系&#xff0c;这个在结果分析中如何使用&#xff0c;就个人经验和朋友讨论后&#xff0c;提出如下建议指导&#xff0c;欢迎同僚指正。相关定义响应时间 网络响应时间 应用程序响应时间响…

密码学电子书_密码学中的电子密码书(ECB)

密码学电子书This Electronic Code Book (ECB) is cryptography as a mode of operation for a block cipher, with the characters the main things that every feasible block of plaintext or an original text has a corresponding characteristic of ciphertext value and…

tsql是mysql中的吗_Mysql中的sql是如何执行的

MySQL中的SQL是如何执行的MySQL是典型的C/S架构,也就是Client/Server架构,服务器端程序使用的mysqld.整体的MySQL流程如下图所示:MySQL是有三层组成:连接层: 负责客户端与服务器端建立连接,客户端发送SQL至服务端;SQL层: 对SQL语句进行查询处理;存储引擎层: 与数据库文件打交道…

软件质量特性测试

针对软件质量特性进行测试&#xff0c;可以避免重大漏测&#xff0c;一般人我不告诉他。《软件工程—产品质量》&#xff08;GB/T 16260-2006&#xff09;中规定对软件的每个质量特性与子特性都有定义&#xff1a;一、功能性&#xff1a;是指当软件在指定条件下使用&#xff0c…

PHP array_pop()函数与示例

PHP array_pop()函数 (PHP array_pop() function) array_pop() function is used to delete/pop last element from the array. array_pop()函数用于从数组中删除/弹出最后一个元素。 Syntax: 句法&#xff1a; array_pop(array);Here, array is the input array, function w…

网站关停就没事了?5100万账户文件被盗

曾经是美国三大音乐视频文件共享软件之一的imesh&#xff0c;意外倒闭。而更意外的是&#xff0c;就在近日&#xff0c;imesh这款已经倒闭的软件&#xff0c;5100万账户开始在暗网被黑客拍卖。 Imesh这款软件是美国纽约的老牌音乐视频分享软件之一&#xff0c;早在2000年前便已…