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

原文连接php

 

 

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

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

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

Tsung

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

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

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

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

在Kubernetes中使用容器运行Tsung

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

如下是具体的操做流程:apache

建立Namespace

$ kubectl create namespace tsung 

使用StatefulSet部署Tsung Slave

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

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

apiVersion: v1 kind: Service metadata: labels: run: tsung-slave name: tsung-slave spec: clusterIP: None selector: run: tsung-slave ports: - port: 22 type: ClusterIP 

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

apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: tsung-slave spec: serviceName: "tsung-slave" replicas: 1 template: metadata: labels: run: tsung-slave spec: containers: - name: tsung image: ddragosd/tsung-docker:1.6.0 env: - name: SLAVE value: "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-master name: tsung-master spec: clusterIP: None selector: run: tsung-master ports: - port: 8091 sessionAffinity: None type: ClusterIP 

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

apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: tsung-master spec: serviceName: "tsung-master" replicas: 1 template: metadata: labels: run: tsung-master spec: containers: - name: tsung image: ddragosd/tsung-docker:1.6.0 env: - name: ERL_SSH_PORT value: "22" args: - -k - -f - /tsung/config.xml - -F - start volumeMounts: - mountPath: /tsung name: config-volume volumes: - configMap: name: tsung-config name: 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。敬请期待。

 

原文连接

 

相关文章
相关标签/搜索