運(yùn)用Kubernetes進(jìn)行分布式負(fù)載測(cè)試-CSDN.NET
發(fā)表于2015-07-07 22:07| 3356次閱讀| 來源Google Cloud Platform| 0 條評(píng)論| 作者Google
摘要:谷歌云平臺(tái)是使用容器進(jìn)行分布式負(fù)載測(cè)試的極優(yōu)環(huán)境,其使用的谷歌容器引擎以開源容器集群管理器
Kubernetes為動(dòng)力,將容器作為一級(jí)對(duì)象對(duì)其提供支持。使用容器引擎可以快速搭建容器基礎(chǔ)設(shè)施,及管理應(yīng)用部
署與資源。
負(fù)載測(cè)試是開發(fā)后臺(tái)基礎(chǔ)架構(gòu)的重要一環(huán),它不但能夠演示系統(tǒng)在真實(shí)需求面前的性能表現(xiàn),還可以通過模擬用戶
與設(shè)備行為,在應(yīng)用程序部署到生產(chǎn)環(huán)境前,找出并了解任何可能的系統(tǒng)瓶頸。
但是,專用的測(cè)試基礎(chǔ)設(shè)施可能非常昂貴且難以維護(hù),且此類設(shè)備一般是針對(duì)特定性能狀況的一次性投資,初期投
資后想要再對(duì)負(fù)載測(cè)試進(jìn)行擴(kuò)展就十分困難,還可能限制實(shí)驗(yàn),從而導(dǎo)致開發(fā)團(tuán)隊(duì)的工作效率變低,應(yīng)用在部署到
生產(chǎn)環(huán)境前也無法得到充分有效的測(cè)試。
解決方案綜述
分布式負(fù)載測(cè)試采用云計(jì)算手段,在各種測(cè)試場景中這種方案都很有吸引力。云平臺(tái)使得基礎(chǔ)設(shè)施平臺(tái)的彈性得到
高度擴(kuò)展,想要通過大量模擬可產(chǎn)生流量的客戶端進(jìn)行應(yīng)用和服務(wù)測(cè)試都十分容易。此外,云計(jì)算的定價(jià)模式與負(fù)
載測(cè)試的彈性特質(zhì)非常相符。
無需再運(yùn)行完整的虛擬機(jī)實(shí)例了,容器提供的輕量級(jí)選擇與虛擬客戶端的快速擴(kuò)展完美匹配。由于其輕量級(jí)、易于
部署、快速可用并適合單一任務(wù)等特質(zhì),容器是取代運(yùn)行測(cè)試客戶端的優(yōu)秀替代方案。
谷歌云平臺(tái)是使用容器進(jìn)行分布式負(fù)載測(cè)試的極優(yōu)環(huán)境,該平臺(tái)使用的谷歌容器引擎
(Google Container Engine)以開源容器集群管理器Kubernetes為動(dòng)力,將容器作為一級(jí)對(duì)象對(duì)其提供支持。使
用容器引擎可以快速搭建容器基礎(chǔ)設(shè)施,并可用來管理應(yīng)用部署與資源。
該解決方案演示了使用容器引擎部署分布式負(fù)載測(cè)試框架的方式。此框架使用多個(gè)容器,搭建了一個(gè)應(yīng)用于簡易
REST-based API的負(fù)載測(cè)試通訊。盡管這是用來測(cè)試簡單Web應(yīng)用的,但同樣的模式可用于創(chuàng)建更為復(fù)雜的負(fù)載測(cè)
試場景中,比如游戲或物聯(lián)網(wǎng)應(yīng)用中。該方案討論了基于容器負(fù)載測(cè)試框架的通用架構(gòu)。請(qǐng)至本文末尾查看 教程,
逐步學(xué)習(xí)樣例框架的構(gòu)建。
本方案著重通過容器引擎來創(chuàng)建負(fù)載測(cè)試通訊,被測(cè)系統(tǒng)是一個(gè)簡單的Web應(yīng)用,使用了REST的API。借助現(xiàn)有的負(fù)
載測(cè)試框架,塑造出下文中詳細(xì)描述到的API互動(dòng)模型。并在完成被測(cè)系統(tǒng)的部署后,運(yùn)用容器引擎來部署分布式負(fù)
載測(cè)試任務(wù)。
被測(cè)系統(tǒng)
在軟件測(cè)試術(shù)語中,被測(cè)系統(tǒng)(System Under Test)指的是該測(cè)試設(shè)計(jì)時(shí)所針對(duì)的待評(píng)估系統(tǒng)。在該方案中,被
測(cè)系統(tǒng)是一個(gè)部署到Google App Engine的小型Web應(yīng)用,該應(yīng)用通過發(fā)布基本REST樣式的端點(diǎn)來捕獲接收的
HTTP POST請(qǐng)求(接收數(shù)據(jù)并不連續(xù))。在真實(shí)場景中,Web應(yīng)用可能會(huì)很復(fù)雜,并包含大量的附加組件及服務(wù),如
caching、messaging和persistence,此方案不考慮這些復(fù)雜情況。更多在谷歌云平臺(tái)上構(gòu)建可擴(kuò)展的Web應(yīng)用相關(guān)
信息,請(qǐng)查看 the Building Scalable and Resilient Web Applications方案。
樣例應(yīng)用的源代碼請(qǐng)見文末教程。
示例workload
許多物聯(lián)網(wǎng)的部署中有類似示例應(yīng)用模型中所使用的后端服務(wù)組件——設(shè)備首次注冊(cè)服務(wù)后,開始報(bào)告指標(biāo)或檢測(cè)
器讀數(shù),并定期重新進(jìn)行服務(wù)的注冊(cè)。
下圖展示了一個(gè)常見的后端服務(wù)組件的交互。
該交互可以用Locust這種基于Python的分布式負(fù)載測(cè)試工具來建模,Locust可以向多個(gè)目標(biāo)路徑分發(fā)請(qǐng)求,比如
向/login和/metrics目標(biāo)路徑分別發(fā)送請(qǐng)求;還有很多負(fù)載生成軟件包也可根據(jù)項(xiàng)目需求選擇使用,包括
JMeter、, Gatling和Tsung。
而workload將會(huì)取決于上面所說到的交互,在Locust會(huì)以一組 task的模型出現(xiàn)。為了盡量模擬真正的客戶端,比如
同時(shí)有上千個(gè)客戶端請(qǐng)求接入的情況,每個(gè)Locust task需經(jīng)過加權(quán)。
基于容器的計(jì)算
從架構(gòu)角度來看,部署該分布式負(fù)載測(cè)試方案有兩個(gè)主要的組件:Locust容器image,還有容器編排及管理機(jī)制。
Locust的容器image是包含Locust軟件的 Docker image,Dockerfile可以在相關(guān)的Github庫中找到(見教程),而
Dockerfile使用了基于Python的image,并使用一些腳本文件來啟動(dòng)Locust服務(wù),執(zhí)行task。
該方案利用谷歌容器引擎用作容器編排與管理機(jī)制。容器引擎是基于開源框架Kubernetes,集合了谷歌多年在容器
部署方面運(yùn)行、編排與管理的經(jīng)驗(yàn)。基于容器的計(jì)算允許開發(fā)人員專注于應(yīng)用本身,無需將精力浪費(fèi)在繁瑣的托管
環(huán)境部署與集成上。容器同時(shí)也使得負(fù)載測(cè)試更為輕便,通過容器整合后的應(yīng)用可以在多個(gè)云環(huán)境中運(yùn)行。容器引
擎與Kubernetes引入了針對(duì)容器編排與管理的若干概念。
容器集群
一個(gè)容器集群包含一組云計(jì)算引擎(Compute Engine)實(shí)例,為整個(gè)應(yīng)用提供基礎(chǔ)。在容器引擎及Kubernetes的文
檔中,這些實(shí)例被稱為節(jié)點(diǎn)。一個(gè)集群包含一個(gè)master節(jié)點(diǎn)和一到多個(gè)worker節(jié)點(diǎn)。master節(jié)點(diǎn)與worker節(jié)點(diǎn)都運(yùn)
行在Kubernetes上,因此容器集群有時(shí)也被稱為Kubernetes集群。更多集群相關(guān)信息請(qǐng)查看 容器引擎文檔。
Pods
Pod是一組應(yīng)當(dāng)被集中部署的緊密耦合容器,一些pod只包含單個(gè)容器,例如該案例中,每個(gè)Locust容器都運(yùn)行在自
己的pod中。但是通常情況下,pod會(huì)包含多個(gè)集中執(zhí)行的容器,例如該案例中,Kubernetes使用了一個(gè)包含三個(gè)容
器的pod提供DNS服務(wù)。
在一個(gè)容器中, SkyDNS提供DNS服務(wù)功能。SkyDNS依賴于一個(gè)名叫etcd的鍵值存儲(chǔ),而它又被封裝在另一個(gè)容器
中。在pod的第三個(gè)容器中, kube2sky擔(dān)任了Kubernetes與SkyDNS之間的橋梁。
復(fù)制控制器
一個(gè)復(fù)制控制器確保特定數(shù)量的pod“副本”能夠隨時(shí)運(yùn)行。如果數(shù)量過多,復(fù)制控制器會(huì)關(guān)掉其中一些;如果數(shù)量
過少,復(fù)制控制器會(huì)啟動(dòng)一些新的。該方案有三個(gè)復(fù)制控制器:一個(gè)確保DNS server的單個(gè)pod存續(xù);另一個(gè)維持
Locust的單個(gè)master pod;第三個(gè)則保證同時(shí)正好有10個(gè)Locust的worker pod運(yùn)行。
服務(wù)
特定pod可能會(huì)因?yàn)楦鞣N原因而消失,包括節(jié)點(diǎn)失效或因更新維護(hù)而主動(dòng)進(jìn)行的節(jié)點(diǎn)中斷。也就是說,pod的IP地址
沒有為其提供可靠的接口。更為有效的辦法是使用該接口的抽象表示,即使底層pod消失,新的pod產(chǎn)生,IP地址發(fā)
生變化,該抽象表示不會(huì)改變。容器引擎服務(wù)通過定義一組邏輯pod及訪問相關(guān)策略,提供這種類型的抽象接口。在
該方案中,有一些代表pod或成組pod的服務(wù)。例如,一個(gè)服務(wù)代表DNS server,另一個(gè)代表
Locust master pod,還有一個(gè)代表那10個(gè)worker pod。
下圖展示了master節(jié)點(diǎn)與worker節(jié)點(diǎn)所包含的內(nèi)容:
部署被測(cè)系統(tǒng)
該方案使用谷歌應(yīng)用引擎來運(yùn)行被測(cè)系統(tǒng)。部署被測(cè)系統(tǒng)需注冊(cè)可用的谷歌云平臺(tái)帳號(hào),以安裝運(yùn)行谷歌云平臺(tái)
SDK,之后通過一個(gè)命令就可以部署這個(gè)樣例Web應(yīng)用了,所需的源代碼在文末教程中可以找到。
部署負(fù)載測(cè)試任務(wù)
部署負(fù)載測(cè)試任務(wù),首先需要部署負(fù)載測(cè)試master,然后是一組10個(gè)的負(fù)載測(cè)試worker。有了這些工作負(fù)載測(cè)試,
就可以根據(jù)測(cè)試目的來創(chuàng)建大量通訊了,但需要銘記:與外部系統(tǒng)產(chǎn)生過多通訊與拒絕服務(wù)攻擊相類似,請(qǐng)務(wù)必回
顧谷歌云平臺(tái)的 服務(wù)條款和谷歌云平臺(tái)的 使用者協(xié)議。
負(fù)載測(cè)試master
部署的第一個(gè)組件就是Locust的master,它是執(zhí)行負(fù)載測(cè)試任務(wù)的入口。部署時(shí)將Locust master部署為只含單個(gè)
副本的復(fù)制控制器,因?yàn)槲覀冎恍枰粋€(gè)master。一個(gè)復(fù)制控制器甚至在部署單個(gè)pod時(shí)都是有效的,因?yàn)樗艽_保
高可用性。
復(fù)制控制器的配置指定了幾個(gè)元素,包括控制器的名字(locust-master)、標(biāo)簽
(name: locust, role: master)、容器所需要發(fā)布的端口(Web接口用8089,與worker通訊用5051和5052)。
這些信息稍后會(huì)被用來配置Locust的worker控制器。下面的信息中包含端口的配置:
...
ports:
- name: locust-master-web
containerPort: 8089
protocol: TCP
- name: locust-master-port-1
containerPort: 5557
protocol: TCP
- name: locust-master-port-2
containerPort: 5558
protocol: TCP
下一步,我們會(huì)部署一個(gè)Service,以確保發(fā)布的端口可以通過hostname訪問其它pod:集群中的端口以及通過描述
性端口名稱的referenceable。通過使用服務(wù),即便在master失效,復(fù)制控制器又生成了新pod的情況下,我們也可
以很容易地找到Locust的worker,并可與master通訊。Locust的master服務(wù)也包含在集群層面創(chuàng)建外部轉(zhuǎn)發(fā)規(guī)則的
指令,提供訪問集群資源的外部通訊能力。注意:還需創(chuàng)建防火墻規(guī)則,以提供訪問目標(biāo)樣例的完整入口。
在部署Locust master之后,就可以通過符合外部轉(zhuǎn)發(fā)規(guī)則的公開IP地址來訪問Web接口了。部署Locust worker之
后,可開啟模擬器并通過Locust Web接口來查看匯總統(tǒng)計(jì)。
負(fù)載測(cè)試worker
下一步部署的組件是Locust worker,用來執(zhí)行負(fù)載壓力測(cè)試。Locust worker是通過能生成10個(gè)pod的單個(gè)復(fù)制控
制器來部署的。這些pod分布在Kubernetes的集群中。每個(gè)pod通過環(huán)境變量來控制重要的配置信息,像是被測(cè)系統(tǒng)
的hostname和Locust master的hostname。worker的復(fù)制控制器配置方式請(qǐng)查看下面的教程。配置包含控制器的名
稱、locust-worker、標(biāo)簽(name: locust, role: worker),還有前面描述的環(huán)境變量。下面代碼包含配置的
名稱、標(biāo)簽、副本數(shù):
kind: ReplicationController apiVersion: v1 metadata: name: locust-worker
labels: name: locust role: worker spec: replicas: 10 selector: name: locust
role: worker ...
對(duì)于Locust worker來說就無需部署額外服務(wù)了,因?yàn)閣orker pod自身不需支持任何入站通訊——它們直接與
Locust master pod相連。
下圖展示了Locust master與Locust worker之間的關(guān)系。
在復(fù)制控制器部署Locust worker之后,就可以返回Locust master的Web接口來查看worker部署數(shù)量相應(yīng)的slave
數(shù)。
執(zhí)行負(fù)載測(cè)試任務(wù)
開啟負(fù)載測(cè)試
Locust的主Web接口允許執(zhí)行針對(duì)被測(cè)系統(tǒng)的負(fù)載測(cè)試任務(wù),見下圖:
開啟時(shí)指定模擬的用戶數(shù)、用戶應(yīng)當(dāng)產(chǎn)生的速率。下一步,點(diǎn)擊Start開始模擬。隨著時(shí)間流逝、用戶產(chǎn)生,可以看
到統(tǒng)計(jì)數(shù)據(jù)開始按模擬指數(shù)進(jìn)行聚合,像是請(qǐng)求數(shù)、每秒請(qǐng)求數(shù),如下圖:
停止模擬只需點(diǎn)擊Stop,測(cè)試就會(huì)終止。完整結(jié)果可以下載表格查看。
擴(kuò)展客戶端
按比例增加模擬用戶會(huì)導(dǎo)致Locust worker pod數(shù)隨之增長。在Locust的worker控制器中有詳細(xì)說明,復(fù)制控制器
部署10個(gè)Locust的worker pod。通過復(fù)制控制器增加pod的數(shù)量,Kubernetes提供了不需重新部署即可調(diào)整控制器
大小的能力。例如,通過kubectl命令行工具可以調(diào)整worker pod的數(shù)量。下面的命令可以將Locust的worker pod
數(shù)量增加到20:
$ kubectl scale --replicas=20 replicationcontrollers locust-worker
在發(fā)出擴(kuò)容命令后,等待幾分鐘,所有pod在此時(shí)間段內(nèi)完成部署并啟動(dòng)。所有pod啟動(dòng)后,回到Locust master的
Web接口,重啟負(fù)載測(cè)試。
資源與成本
這個(gè)解決方案使用了四個(gè)容器引擎節(jié)點(diǎn),每個(gè)都受云計(jì)算引擎VM標(biāo)準(zhǔn)n1-standard-1類型的支持。你可以使用谷歌云
平臺(tái)的定價(jià)計(jì)算器估算運(yùn)行容器集群的月開銷。上文提到過,可以按需定制容器集群的大小。定價(jià)計(jì)算器可以協(xié)助
你自定義集群特點(diǎn),借此評(píng)估開銷的增減。
下一步
現(xiàn)在可以查看如何使用容器引擎來創(chuàng)建簡單Web應(yīng)用的負(fù)載測(cè)試框架了。容器引擎允許你指定建立負(fù)載測(cè)試框架容器
所需的節(jié)點(diǎn)數(shù)量。容器引擎還允許你將負(fù)載測(cè)試工作節(jié)點(diǎn)合并到pod中,并制定容器引擎運(yùn)行時(shí)想要保持的pod數(shù)
量。
使用同樣的模式來創(chuàng)建不同環(huán)境變量與應(yīng)用的負(fù)載測(cè)試框架。例如,使用該模式創(chuàng)建信息系統(tǒng)、數(shù)據(jù)流管理系統(tǒng)與
數(shù)據(jù)庫系統(tǒng)的負(fù)載測(cè)試框架。創(chuàng)建新的Locust任務(wù),甚至是不同的負(fù)載測(cè)試框架。
擴(kuò)展框架的另一辦法是自定義收集到的指數(shù)。例如,你可能想要測(cè)量每秒的請(qǐng)求數(shù),或者監(jiān)聽負(fù)載增加后的響應(yīng)延
遲情況,或是查看響應(yīng)失敗率與錯(cuò)誤類型。有多種可選的監(jiān)控方式,包括 谷歌云監(jiān)控
(Google Cloud Monitoring)。
教程
完整教程包含使用說明與源代碼,請(qǐng)點(diǎn)擊 下載查看。
英文原文: Distributed Load Testing Using Kubernetes(譯者/孫薇 審校/朱正貴 責(zé)編/仲浩)
【預(yù)告】 首屆中國人工智能大會(huì)(CCAI 2015)將于7月26-27日在北京友誼賓館召開。機(jī)器學(xué)習(xí)與模式識(shí)別、大數(shù)
據(jù)的機(jī)遇與挑戰(zhàn)、人工智能與認(rèn)知科學(xué)、智能機(jī)器人四個(gè)主題專家云集。人工智能產(chǎn)品庫將同步上線,預(yù)約咨詢:
QQ:1192936057。歡迎關(guān)注。
獲取更多Container技術(shù)資訊,請(qǐng)掃描下方二維碼關(guān)注我們
本文為CSDN編譯整理,未經(jīng)允許不得轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)聯(lián)系market#csdn.net(#換成@)
頂
6
踩
0
CSDN官方微信
掃描二維碼,向CSDN吐槽
微信號(hào):CSDNnews