內(nèi)容來(lái)源:2017年4月8日,第四范式資深測(cè)試開(kāi)發(fā)工程師孫高飛在“餓了么技術(shù)沙龍【第四彈】北京研發(fā)中心測(cè)試專(zhuān)場(chǎng)”進(jìn)行《docker搭建大規(guī)模測(cè)試環(huán)境的實(shí)踐》演講分享。IT大咖說(shuō)作為獨(dú)家視頻合作方,經(jīng)主辦方和講者審閱授權(quán)發(fā)布。 摘要Docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,第四范式資深測(cè)試開(kāi)發(fā)工程師將從四個(gè)方面來(lái)分享關(guān)于docker搭建大規(guī)模測(cè)試環(huán)境的實(shí)踐。 大咖演講視頻http:///RKm8iVo 困境 當(dāng)今互聯(lián)網(wǎng)行業(yè)發(fā)展迅速,產(chǎn)品架構(gòu)逐漸復(fù)雜,導(dǎo)致環(huán)境搭建困難。 測(cè)試環(huán)境不一致。 因?yàn)榇罱ōh(huán)境困難,環(huán)境不多,所以一套環(huán)境有多人使用,容易造成環(huán)境的互相踩踏問(wèn)題。 隨著業(yè)務(wù)的發(fā)展和時(shí)間的積累,我們發(fā)現(xiàn)case越來(lái)越多。我們希望能夠用分布式的執(zhí)行方式在多臺(tái)機(jī)器上并發(fā)執(zhí)行,以提升執(zhí)行速度。但是測(cè)試機(jī)器稀缺,速度依然無(wú)法提升。
自動(dòng)化 搭建一個(gè)環(huán)境必須做到一鍵部署,在遷移、實(shí)踐和刪除環(huán)境中也要做到自動(dòng)化。 標(biāo)準(zhǔn)化 標(biāo)準(zhǔn)化用來(lái)解決測(cè)試環(huán)境不一致的問(wèn)題。我們希望測(cè)試環(huán)境、開(kāi)發(fā)環(huán)境甚至生產(chǎn)環(huán)境都是一致的。 集群化 根據(jù)以往的經(jīng)驗(yàn)發(fā)現(xiàn),測(cè)試資源是一種比較稀缺的資源。要把測(cè)試環(huán)境擴(kuò)展到一定的量級(jí),使稀缺資源變成普通的、人人都能簡(jiǎn)單獲取的一種資源,這樣就省去了復(fù)雜的流程和排隊(duì)等待的過(guò)程。 DOCKER 容器技術(shù)相較于虛擬機(jī)來(lái)說(shuō)還是非常節(jié)省資源的。Docker不需要運(yùn)行完整的操作系統(tǒng)。在一個(gè)宿主機(jī)上運(yùn)行的所有容器都是共享宿主機(jī)的內(nèi)核,所以每啟動(dòng)一個(gè)容器,都比虛擬機(jī)節(jié)省了一個(gè)內(nèi)核的空間。 簡(jiǎn)化了運(yùn)維成本,極大降低部署環(huán)境的學(xué)習(xí)門(mén)檻。 假如公司新進(jìn)了一批機(jī)器,要把環(huán)境遷移到某些環(huán)境上來(lái),只要把它做成鏡像,就可以很方便地進(jìn)行遷移。而且這些鏡像都是一致的,通過(guò)制作鏡像可以解決標(biāo)準(zhǔn)化的問(wèn)題。 容器的啟動(dòng)速度和刪除速度都是秒級(jí)的,有些不是長(zhǎng)時(shí)間運(yùn)行的服務(wù)在用完后就能將其刪除。這樣docker的宿主機(jī)就始終能保持一個(gè)低壓力的狀態(tài)。 把應(yīng)用程序當(dāng)成一個(gè)個(gè)集裝箱,全都放在docker里。主要是放基礎(chǔ)容器、測(cè)試環(huán)境和測(cè)試執(zhí)行機(jī)器。也可把執(zhí)行測(cè)試機(jī)器全部制作成鏡像,在需要使用的時(shí)候啟動(dòng)它并放進(jìn)docker里。 網(wǎng)絡(luò)的玩法 端口映射 在docker默認(rèn)的啟動(dòng)模式是bridege模式的情況下,docker為我們創(chuàng)建了一個(gè)叫docker0的網(wǎng)橋,這個(gè)網(wǎng)橋?qū)iT(mén)負(fù)責(zé)為容器進(jìn)行轉(zhuǎn)發(fā)。它會(huì)給容器分配很多虛擬IP,但這些IP只能在容器內(nèi)部溝通使用。要是想與容器進(jìn)行通訊,最常用的方法就是端口映射,把容器端口映射到宿主機(jī)上。 這種方式的優(yōu)點(diǎn)是簡(jiǎn)單,不用做任何配置。當(dāng)然它的缺點(diǎn)也很明顯,要維護(hù)一個(gè)很龐大的端口列表,記住每一個(gè)環(huán)境容器的端口是什么,對(duì)外暴露的端口是什么。 固定IP 我們希望這些容器能像虛擬機(jī)一樣,給它分配真實(shí)的IP去訪問(wèn)它。但這個(gè)做法會(huì)稍微有些麻煩,docker不支持這樣做,我們需要利用一些轉(zhuǎn)化規(guī)則。 創(chuàng)建一個(gè)新的網(wǎng)橋br0,給它分配一個(gè)真實(shí)的IP,把宿主機(jī)的網(wǎng)卡掛到網(wǎng)橋上,同時(shí)改變docker的啟動(dòng)參數(shù),默認(rèn)啟動(dòng)的時(shí)候連到br0上。重新劃分網(wǎng)段,把所有容器的網(wǎng)段全都分配成和宿主機(jī)在相同的網(wǎng)段上。這樣啟動(dòng)容器時(shí)分配的就是真實(shí)IP,并與宿主機(jī)相處于同一個(gè)網(wǎng)段。 這種方式讓外界用戶感受不到是在使用容器還是虛擬機(jī),是對(duì)測(cè)試環(huán)境非常友好的一種方式。 但它并不適合在大規(guī)模的測(cè)試環(huán)境中使用。所有環(huán)境都有了真實(shí)IP,都被放到了真實(shí)的網(wǎng)絡(luò)環(huán)境中,如果容器太多就會(huì)出現(xiàn)廣播風(fēng)暴的問(wèn)題。 環(huán)境部署 Container模式 Container模式的特點(diǎn)是可以把所有容器綁定到一個(gè)IP地址上。 雖然所有模塊都裝在不同的容器里,但它們都有同樣的IP,只是它們用不同的端口對(duì)外暴露服務(wù)。 它的優(yōu)點(diǎn)是配置管理,效率高,是對(duì)開(kāi)發(fā)最友好的一種模式。 缺點(diǎn)是標(biāo)準(zhǔn)化。因?yàn)槲覀児井a(chǎn)品的一些特性,產(chǎn)品環(huán)境并不是這樣去部署的,所以可能會(huì)出現(xiàn)環(huán)境不一致帶來(lái)的一系列問(wèn)題。 打包模式 有多少模塊就并發(fā)啟動(dòng)多少容器,這些容器的網(wǎng)絡(luò)模式可以用host。Host的特性是把所有容器的網(wǎng)絡(luò)環(huán)境掛載到宿主機(jī)上。把這些并發(fā)編譯后上傳到FTP上,然后啟動(dòng)一個(gè)或多個(gè)部署容器。 打包模式的優(yōu)點(diǎn)就是標(biāo)準(zhǔn)化。但它的效率不如Container模式高。 存儲(chǔ)的玩法 外部存儲(chǔ) 把數(shù)據(jù)庫(kù)放到容器外面,在容器內(nèi)部和數(shù)據(jù)庫(kù)進(jìn)行溝通,保證數(shù)據(jù)庫(kù)不會(huì)造成數(shù)據(jù)的丟失。 Volume存儲(chǔ) 這是docker比較推薦的一種方式。它允許把容器中的某個(gè)路徑掛載到外部設(shè)備上。比如掛載到宿主機(jī)上,容器實(shí)時(shí)向文件中寫(xiě)數(shù)據(jù),宿主機(jī)上同時(shí)也會(huì)保存這份數(shù)據(jù)。 集群 我們想要提供一個(gè)統(tǒng)一接口去管理集群上所有節(jié)點(diǎn),所以考慮使用一些開(kāi)源的分布式框架。目前在業(yè)界最火的三種框架就是mesos、Kubernetes、swarm mode。 Mesos誕生的時(shí)間非常早,專(zhuān)注于資源調(diào)度,后來(lái)docker火了之后才兼容了docker。它的調(diào)度框架的二次調(diào)度,只裝一個(gè)mesos是不夠的,還依賴于很多其它的東西。Mesos發(fā)展得越來(lái)越復(fù)雜,需要專(zhuān)業(yè)運(yùn)維去支持,所以mesos并不適合作為測(cè)試環(huán)境的框架來(lái)使用。 Kubernetes是google內(nèi)部集群框架block的一個(gè)開(kāi)源版本。它當(dāng)時(shí)是為docker設(shè)計(jì)的,而現(xiàn)在Kubernetes慢慢開(kāi)始兼容其它平臺(tái)。Kubernetes原本應(yīng)該是最復(fù)雜的集群管理框架,google提供了客戶端工具,把很多內(nèi)部細(xì)節(jié)封裝起來(lái),簡(jiǎn)化了它的使用方式。它最近推行的容器化部署也極大降低了Kubernetes的使用門(mén)檻。 Swarmmode是從docker1.12版本開(kāi)始內(nèi)置到docker引擎當(dāng)中的,非常簡(jiǎn)單。它把所有需要的東西全都內(nèi)置到了一條命令上。只要運(yùn)行一次這條命令,所有的服務(wù)發(fā)現(xiàn)、跨節(jié)點(diǎn)溝通等等的負(fù)載均衡都已經(jīng)做好了。Swarm mode是三種框架中最簡(jiǎn)單的一種,但并不靈活,功能也沒(méi)有那么強(qiáng)大了。
POD Pod是Kubernetes一個(gè)邏輯的概念,是一組容器的組合,是Kubernetes在一個(gè)節(jié)點(diǎn)上控制的最小的邏輯單元。 Deployment 可以把Deployment看成一個(gè)守護(hù)進(jìn)程,如果把一個(gè)Pod掛載到Deployment上面,它能保證Pod始終運(yùn)行。要是監(jiān)控到定義的這組Pod某一個(gè)節(jié)點(diǎn)掛了,容器也都掛了,它會(huì)利用調(diào)度系統(tǒng)找一個(gè)合適的節(jié)點(diǎn)啟這些Pod。Deployment可以關(guān)聯(lián)多組Pod。 Service Service同樣可以關(guān)聯(lián)到多組環(huán)境上,幫我們做負(fù)載均衡。當(dāng)有請(qǐng)求過(guò)來(lái)的時(shí)候,Service會(huì)自動(dòng)分配到各種不同的Pod上去。假如出現(xiàn)了運(yùn)維事故或IT事故,一個(gè)節(jié)點(diǎn)掛了,它會(huì)自動(dòng)切換到其它幾個(gè)節(jié)點(diǎn)的容器上去運(yùn)行,不會(huì)影響到它的服務(wù),保證了PM的環(huán)境是始終存在的。 安裝服務(wù) 從單點(diǎn)擴(kuò)展到集群,復(fù)雜度就提升了。 首先要關(guān)注的就是跨主機(jī)通信問(wèn)題。Docker分配的是虛擬IP,只能在一個(gè)節(jié)點(diǎn)的容器中互相溝通。擴(kuò)展到集群之后,要裝一個(gè)網(wǎng)絡(luò)插件來(lái)解決問(wèn)題。 容器之間要互相溝通,必須知道對(duì)方的IP地址。Docker在每次啟動(dòng)的時(shí)候IP地址都會(huì)改變,要有一個(gè)DNS去注冊(cè)域名,在配置文件中做通訊的時(shí)候執(zhí)行這個(gè)域名就可以了。 要知道容器運(yùn)行消耗了多少資源,應(yīng)該再安裝一個(gè)服務(wù)來(lái)做容器級(jí)的監(jiān)控。 Docker變向集群化的時(shí)候,就面臨了鏡像如何在每一個(gè)節(jié)點(diǎn)上進(jìn)行分發(fā)的問(wèn)題。所以要有一個(gè)鏡像倉(cāng)庫(kù)來(lái)存放所有鏡像,每個(gè)節(jié)點(diǎn)都會(huì)拉最新鏡像進(jìn)行部署。 |
|