基于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.pswp.cn/news/541099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541099.shtml
英文地址,請注明出處:http://en.pswp.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年前便已…