首先說(shuō)一下我們都用容器做什么。主要三大類,第一種是諸如testlink,jenkins這種基礎(chǔ)服務(wù)。第二種是產(chǎn)品的測(cè)試環(huán)境,這是占比最多的。然后就是我們的測(cè)試執(zhí)行機(jī)器了。例如UI自動(dòng)化,我們采取的是分別將selenium hub和node docker化的做法。如下圖:
當(dāng)UI自動(dòng)化的case增多的時(shí)候,分布式運(yùn)行往往是最好的解決方案。 目前我們通過(guò)這種方式容器化了20個(gè)瀏覽器進(jìn)行并發(fā)測(cè)試。這些鏡像都有官方的版本,使用起來(lái)還是蠻方面的。
然后說(shuō)一下比較關(guān)鍵的網(wǎng)絡(luò)解決方案,我們從單機(jī)到集群,中途歷經(jīng)了集中網(wǎng)絡(luò)模型的變化。從一開始的端口映射,到利用路由規(guī)則給容器分配真實(shí)的ip,再到給每個(gè)容器在DHCP和DNS服務(wù)器上注冊(cè)和續(xù)租。到最后我們演進(jìn)出了下面這個(gè)k8s的網(wǎng)絡(luò)模型。
我們知道每個(gè)docker宿主機(jī)都會(huì)自己維護(hù)一個(gè)私有網(wǎng)絡(luò)。如果想讓容器跨主機(jī)通訊或者外部訪問(wèn)容器。一般就是通過(guò)三種方式: 端口映射,路由規(guī)則以及overlay網(wǎng)絡(luò)。我們選擇在k8s中引入的overlay網(wǎng)絡(luò)是weave,以解決夸主機(jī)通信問(wèn)題。安裝kube-dns實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)。之后為了能讓外部訪問(wèn)容器服務(wù), 使用了k8s提供的ingress機(jī)制來(lái)實(shí)現(xiàn)。這個(gè)ingress網(wǎng)絡(luò)其實(shí)就是在集群中啟動(dòng)一個(gè)容器,這個(gè)容器既能訪問(wèn)容器網(wǎng)絡(luò)的同是還監(jiān)聽了宿主機(jī)的80端口。容器里是一個(gè)nginx,它會(huì)負(fù)責(zé)幫忙轉(zhuǎn)發(fā)請(qǐng)求。nginx負(fù)責(zé)轉(zhuǎn)發(fā)的有servicename和path,這里我們是無(wú)法使用路徑進(jìn)行轉(zhuǎn)發(fā)的。所以我們?cè)诠緝?nèi)部的DNS上做了泛域名解析。所有testenv為后綴的域名都會(huì)解析成集群的master節(jié)點(diǎn)的ip。這樣我們的請(qǐng)求就能命中nginx中固定的servicename并做轉(zhuǎn)發(fā)了。通過(guò)這種機(jī)制我們就可以很方面的訪問(wèn)容器提供的服務(wù)。當(dāng)然ingress的缺點(diǎn)是暫時(shí)還無(wú)法做4層轉(zhuǎn)發(fā)。如果要訪問(wèn)4層協(xié)議的服務(wù)暫時(shí)還是只能暴露node port。
我們這個(gè)測(cè)試環(huán)境的管理平臺(tái)主要的架構(gòu)是這樣的:
集群中所有的鏡像都過(guò)公司內(nèi)部搭建的鏡像倉(cāng)庫(kù)進(jìn)行共享,我們?cè)诩褐习惭b了各種服務(wù)來(lái)滿足測(cè)試環(huán)境的需要。例如使用NFS做數(shù)據(jù)持久化,Heapster+Grafana+InfluxDB做性能監(jiān)控,kube-DNS做服務(wù)發(fā)現(xiàn),dashboard提供web管理界面,weave做集群網(wǎng)絡(luò),ingress做服務(wù)的轉(zhuǎn)發(fā)。并且我們?cè)谶@個(gè)整體上針對(duì)k8s的APIserver做了一層cli的封裝。我們嘗試過(guò)腳本管理,web服務(wù)管理,但是發(fā)現(xiàn)大家對(duì)這些方式的接受度都不高。我們面對(duì)的大多數(shù)都是一幫做夢(mèng)都在寫代碼的人,所以我們換做提供一個(gè)cli的方式可以讓使用者更靈活來(lái)定制自己需要的服務(wù)。通過(guò)這種形式,我們?cè)诠緝?nèi)部搭建了一個(gè)可以提供測(cè)試資源的私有云,配合jenkins我們可以很方便的一鍵部署我們需要的環(huán)境并執(zhí)行UT,接口,UI自動(dòng)化測(cè)試等等,并提供一個(gè)詳細(xì)的測(cè)試報(bào)告。下面是我們的部署一個(gè)環(huán)境后所提供的測(cè)試報(bào)告。