平安健康的Docker應(yīng)用與實(shí)踐經(jīng)驗(yàn)
做為容器技術(shù)的代表,Docker已經(jīng)逐漸獲得了企業(yè)的認(rèn)可。之前InfoQ就有報(bào)道過,國內(nèi)的新浪微博、雪球網(wǎng)等互聯(lián)網(wǎng)公司都在生產(chǎn)環(huán)境中成功使用了Docker。而對(duì)于一些傳統(tǒng)公司,他們的IT設(shè)施薄弱、應(yīng)用架構(gòu)復(fù)雜,在擁抱Docker時(shí),可能遇到的問題相對(duì)較多。為此,InfoQ采訪了平安健康互聯(lián)網(wǎng)技術(shù)平臺(tái)資深架構(gòu)師王延炯。另外,王延炯將在6月11日的PWorld 軟件架構(gòu)&平臺(tái)創(chuàng)新大會(huì)上分享題為《基于Docker的開發(fā)、運(yùn)維一體化實(shí)踐》的主題演講。
InfoQ:您認(rèn)為Docker***的優(yōu)勢(shì)是什么?當(dāng)時(shí)公司為什么決定使用Docker?
王延炯:Docker優(yōu)勢(shì)有幾點(diǎn),首先是輕量級(jí),其次是面向管理透明,***是生態(tài)環(huán)境正在逐步建立、社區(qū)活躍。輕量級(jí)的容器這點(diǎn),是大家都公認(rèn)的優(yōu)勢(shì),我不做過多解釋。而面向管理透明主要是指Dockerfile與AUFS的結(jié)合,使得軟件的運(yùn)行環(huán)境面向開發(fā)、測(cè)試、運(yùn)維團(tuán)隊(duì)變得透明。而Registry是平臺(tái)軟件云化的特征之一。另外,Docker的迅速發(fā)展,與其生態(tài)環(huán)境的蓬勃發(fā)展是相輔相成的,例如有Jenkins、Ansible等一系列面向CI以及運(yùn)維友好的工具平臺(tái)迅速支撐。
我們公司面向技術(shù)平臺(tái)的選型,還是比較開放的,各個(gè)團(tuán)隊(duì)可以選擇適合自己的平臺(tái),可以嘗試新技術(shù),但目的只有一個(gè),提高公司整體的運(yùn)營效率。選擇Docker,一方面因?yàn)槭且陨咸岬降膸讉€(gè)優(yōu)勢(shì)點(diǎn),另外它也是虛擬化(如Xen/KVM)技術(shù)、容器技術(shù)兩者并行發(fā)展過程中,沉淀出一套適合于公司特點(diǎn)本身,需要取長(zhǎng)補(bǔ)短、逐步形成一套***實(shí)踐的必經(jīng)之路。
Docker技術(shù)本身還是在不斷的發(fā)展之中,作為一個(gè)新技術(shù),它的出現(xiàn)改變了很多原有軟件研發(fā)的流程。將其應(yīng)用到生產(chǎn)環(huán)境,***,對(duì)大公司而言是需要公司整體進(jìn)行調(diào)整,不僅僅是技術(shù)本身,還有配套的組織結(jié)構(gòu)、管理制度與流程相結(jié)合;第二,Docker本身的網(wǎng)絡(luò)、存儲(chǔ)、監(jiān)控等技術(shù)領(lǐng)域的關(guān)鍵問題還需要進(jìn)一步的驗(yàn)證和實(shí)踐,才能夠?qū)⑵鋺?yīng)用到相應(yīng)的生產(chǎn)環(huán)境。第三,生產(chǎn)環(huán)境的安全等級(jí)(包括穩(wěn)定性要求),也是根據(jù)不同的業(yè)務(wù)等級(jí)會(huì)有不同的要求,一些低等級(jí)的生產(chǎn)環(huán)境,使用Docker是沒有任何問題的。
InfoQ:那在應(yīng)用Docker后,你們內(nèi)部在組織結(jié)構(gòu)、管理制度上做了怎么樣的調(diào)整?
王延炯:在開發(fā)測(cè)試過程中,相關(guān)團(tuán)隊(duì)經(jīng)常會(huì)找運(yùn)維團(tuán)隊(duì)分配一些開發(fā)機(jī)、測(cè)試機(jī)。而分配主機(jī)只是***步,相伴而來的還有一些配置工作,例如運(yùn)行期所需要的域名等等。
當(dāng)然,除了Docker之外,如果用KVM、Xen等虛擬化技術(shù),也可以實(shí)現(xiàn)分配。但需要注意的是,使用虛擬化技術(shù)所分配出來的主機(jī)資源,基本上要比使用Docker技術(shù)分配出來的主機(jī)資源少一個(gè)數(shù)量級(jí),甚至更多。最直觀的感受就是,在相同物理宿主機(jī)條件下,可以分配更多的“主機(jī)”了。這樣給軟件交付所帶來的好處(這也是Docker所倡導(dǎo)的)是一個(gè)容器內(nèi)只運(yùn)行一個(gè)進(jìn)程。每個(gè)應(yīng)用系統(tǒng),縱向前后臺(tái)分離、橫向多實(shí)例負(fù)載聚合,運(yùn)行期的每個(gè)實(shí)例都可以不受干擾的運(yùn)行在一個(gè)獨(dú)立的環(huán)境之中。
初看這只是一個(gè)量變的過程,但到一定程度就變成了質(zhì)變,相同大小的運(yùn)維團(tuán)隊(duì)所要維護(hù)的“主機(jī)”數(shù),可能就多了一個(gè)數(shù)量級(jí)。所以使用Docker之后,在組織結(jié)構(gòu)和管理制度上,運(yùn)維團(tuán)隊(duì)只要在平臺(tái)層面提供Docker資源池,由各個(gè)項(xiàng)目的開發(fā),或者測(cè)試負(fù)責(zé)人,自行在資源池內(nèi)分配主機(jī)資源。所有動(dòng)作都在Web界面完成,并且有簡(jiǎn)單的工作流審批,減少資源濫用。
InfoQ:你們的Docker應(yīng)用場(chǎng)景是怎么樣的?能介紹下你們所使用的技術(shù)棧嗎?
王延炯:關(guān)于Docker應(yīng)用場(chǎng)景,目前各個(gè)技術(shù)團(tuán)隊(duì)都根據(jù)自身的特點(diǎn)進(jìn)行應(yīng)用,大體上主要將Docker應(yīng)用于開發(fā)、測(cè)試環(huán)境,不同的場(chǎng)景使用的技術(shù)棧也有區(qū)別。
在開發(fā)測(cè)試環(huán)境會(huì)使用SaltStack等技術(shù)對(duì)容器進(jìn)行集中化管理,其主要使用方式較為傳統(tǒng),主要為開發(fā)測(cè)試人員提供主機(jī)(操作系統(tǒng))級(jí)服務(wù),這與整個(gè)團(tuán)體的軟件研發(fā)過程息息相關(guān)。
在SCM/CI平臺(tái),有相當(dāng)大一部分開源工具已經(jīng)由社區(qū)實(shí)現(xiàn)了Docker化,能夠方便的將代碼與數(shù)據(jù)分離,使得平臺(tái)能夠進(jìn)行快速升級(jí)、二次開發(fā)與定制。
在細(xì)節(jié)方面,諸如IP地主與主機(jī)名、IP地址(DHCP)與域名都進(jìn)行了一定程度的二次開發(fā)與集成,目前可以實(shí)現(xiàn)Docker容器實(shí)例、主機(jī)名、域名綁定的Web端一鍵式自助分配與注冊(cè)。
InfoQ:可否詳細(xì)聊聊你們基于Docker的workflow嗎?
王延炯:關(guān)于Docker的workflow,如之前提到的,有基于Web端的一鍵式主機(jī)(也就是Docker容器)分配平臺(tái),支持開發(fā)、測(cè)試環(huán)境的主機(jī)自動(dòng)創(chuàng)建、IP分配、域名綁定,并包含與組織結(jié)構(gòu)的審批流程。
另外,在我團(tuán)隊(duì)所使用的Docker環(huán)境中,會(huì)將Docker與Jenkins/GitLab等平臺(tái)工具相結(jié)合,一方面將代碼固化至Docker鏡像中,一方面將配置文件作為數(shù)據(jù)分離到鏡像之外。這樣做的好處是,在一些無狀態(tài)的業(yè)務(wù)邏輯服務(wù)中,往往只需要『代碼+環(huán)境配置』,就可以部署到不同的運(yùn)行環(huán)境中。例如同一份代碼,與不同的開發(fā)、功能測(cè)試、性能測(cè)試環(huán)境配置相結(jié)合(docker -v參數(shù)),就能夠快速部署相應(yīng)的服務(wù)實(shí)例,并且可以與Docker自帶的restful接口做集成,甚至是使用IntelliJ 14.1的Docker插件,能夠做到從IDE到目標(biāo)環(huán)境的一鍵式快速發(fā)布與部署。需要注意的是,這樣做需要把程序的所有配置做盡可能地集中化處理,并且以Key-Value格式,降低錯(cuò)誤幾率。
InfoQ:Docker有很多的坑,你們的應(yīng)用過程中是不是也遇到了?可以和大家分享下你印象深刻的幾個(gè)坑嗎?
王延炯:Docker的坑,在實(shí)際最多的還是集中于網(wǎng)絡(luò)。大多數(shù)的使用場(chǎng)景,還是需要解決容器在不同的宿主機(jī)之間的可達(dá)性,這是決定Docker應(yīng)用范圍的***步。簡(jiǎn)單的使用端口映射,往往不能夠解決運(yùn)行期的端口動(dòng)態(tài)監(jiān)聽和容器間互聯(lián)。
另外,Docker的性能監(jiān)控,也是決定Docker應(yīng)用于什么樣等級(jí)的業(yè)務(wù)系統(tǒng)的關(guān)鍵因素,這也是近期除了網(wǎng)絡(luò)之外主要深耕的一個(gè)領(lǐng)域。目前還沒有對(duì)Docker進(jìn)行代碼級(jí)的優(yōu)化和hack,側(cè)重點(diǎn)還是在團(tuán)隊(duì)的整體運(yùn)行效率、軟件過程效率、業(yè)務(wù)持續(xù)交付中。
InfoQ:Docker最適合微服務(wù)架構(gòu)的應(yīng)用,像傳統(tǒng)非互聯(lián)網(wǎng)公司的IT系統(tǒng),應(yīng)該很多應(yīng)用都不是這樣的架構(gòu)。你們是如何過渡和應(yīng)用的?有什么好的經(jīng)驗(yàn)分享嗎?
王延炯:首先,我們要回想一下到底什么是微服務(wù)或者叫微應(yīng)用。我個(gè)人認(rèn)為所謂微服務(wù)或者微應(yīng)用,尤其在傳統(tǒng)重業(yè)務(wù)的非互聯(lián)網(wǎng)領(lǐng)域,其定位應(yīng)當(dāng)是一些非核心系統(tǒng),或者是一些業(yè)務(wù)創(chuàng)新驅(qū)動(dòng)的服務(wù)或應(yīng)用,或者是一些架構(gòu)于核心系統(tǒng)之上的組合、集成性質(zhì)的輕應(yīng)用。在技術(shù)層面,他們的特征是代碼量小,隨著業(yè)務(wù)快速變化可以迅速升級(jí)。而相對(duì)的,大平臺(tái)不僅僅是指一個(gè)技術(shù)平臺(tái),廣義上應(yīng)當(dāng)是一個(gè)以各種技術(shù)標(biāo)準(zhǔn)進(jìn)行兼容和統(tǒng)一為基礎(chǔ),并提供多類型的業(yè)務(wù)平臺(tái),需要有效、高效支撐上層的微應(yīng)用和微服務(wù)的繁衍。隨著時(shí)間的推移和業(yè)務(wù)的發(fā)展,一些微服務(wù)、微應(yīng)用,可以被吸收、沉淀至大平臺(tái)中,發(fā)揮更大的作用。
其次,對(duì)于傳統(tǒng)公司而言,我并不建議為了追求新鮮的技術(shù)而一定要向Docker之類的『時(shí)鮮平臺(tái)』進(jìn)行遷移,保障復(fù)雜業(yè)務(wù)的穩(wěn)定性才是重中之重。像Docker之類的新技術(shù),可以采取『農(nóng)村包圍城市』的策略,先在外部非核心系統(tǒng)試點(diǎn),根據(jù)企業(yè)自身的開發(fā)、測(cè)試、運(yùn)維的特點(diǎn),積累和沉淀出一套適合自己的平臺(tái)的方法經(jīng)驗(yàn)論,當(dāng)然其指導(dǎo)原則就是高效可靠。需要注意的是這個(gè)過程可能是漫長(zhǎng)的,需要技術(shù)主導(dǎo),也需要組織保障。
第三,我們可以發(fā)現(xiàn),就Docker技術(shù)本身而言,它提供的是一個(gè)輕量級(jí)的容器,并沒有集成每個(gè)企業(yè)所確立的容器基礎(chǔ)設(shè)施基線。而企業(yè)的基礎(chǔ)鏡像一般只是一個(gè)操作系統(tǒng)級(jí)的容器(公有社區(qū)的Registry,不在此討論范圍之內(nèi)),在此基礎(chǔ)之上,我們可以在Dockerfile里面,透明的定義具體應(yīng)用或者服務(wù)所需要的本地運(yùn)行環(huán)境(例如JDK、Node.js、Python等等),加之以具體的服務(wù)、應(yīng)用,在運(yùn)行期形成一個(gè)服務(wù)或應(yīng)用的實(shí)例。。
第四,從企業(yè)架構(gòu)而言,一個(gè)服務(wù)或者應(yīng)用往往需要其它中間件的支持(如數(shù)據(jù)庫、緩存、分布式文件系統(tǒng)),也需要集群高可用的部署。這就牽扯到集群拓?fù)洌ㄓ徐o態(tài)也有動(dòng)態(tài)的),包括縱向的從上層應(yīng)用到底層的硬件物理設(shè)施,橫向的多實(shí)例負(fù)載均衡與備份。一個(gè)完備的企業(yè)級(jí)容器平臺(tái),還需要有實(shí)時(shí)的監(jiān)控和管理手段來輔助。Docker本身,并不提供這些企業(yè)級(jí)運(yùn)維工具或者來支撐,都需要基于開源工具進(jìn)行集成和定制開發(fā)。
可以看到,把以上所有問題都解決了,對(duì)于傳統(tǒng)企業(yè),尤其是傳統(tǒng)非互聯(lián)網(wǎng)大型企業(yè),Docker的大范圍推廣才具備可行性。Docker是否在企業(yè)里能夠推廣,用短板模型來衡量的話,這個(gè)短板應(yīng)該是在運(yùn)維團(tuán)隊(duì),并不是在開發(fā)團(tuán)隊(duì)。
受訪嘉賓介紹
王延炯博士,畢業(yè)于北京郵電大學(xué)網(wǎng)絡(luò)與交換技術(shù)國家重點(diǎn)實(shí)驗(yàn)室?,F(xiàn)任平安健康互聯(lián)網(wǎng)技術(shù)平臺(tái)資深架構(gòu)師,關(guān)注企業(yè)互聯(lián)網(wǎng)化過程中的軟件平臺(tái)技術(shù)路線。曾先后于西門子中國研究院、普元信息擔(dān)任資深架構(gòu)師,期間專注于內(nèi)存計(jì)算、大數(shù)據(jù)實(shí)時(shí)分析平臺(tái)的產(chǎn)品架構(gòu)設(shè)計(jì)工作;參與并主持了十余項(xiàng)三大電信運(yùn)營商、中國銀聯(lián)、中國登記上海公司等行業(yè)領(lǐng)軍企業(yè)的平臺(tái)軟件架構(gòu)設(shè)計(jì)。