由Docker大規(guī)模運(yùn)行中總結(jié)的六大實(shí)踐經(jīng)驗(yàn)
除非你在過(guò)去幾年里一直生活在石器時(shí)代,否則你肯定知道容器和Docker。如果你是互聯(lián)網(wǎng)極客的話,可能你已經(jīng)準(zhǔn)備在生產(chǎn)環(huán)境中使用Docker了。
一年前我也在嘗試跟上技術(shù)更新的步伐,但以忙于交付原生態(tài)的系統(tǒng)結(jié)束。我見識(shí)到的雖讓我某種程度上傷痕累累,但也讓我收獲頗豐,更重要的是讓我意識(shí)到很多很流行工具的缺點(diǎn)。直到我們建立起一套不錯(cuò)的托管技術(shù)棧的時(shí)候,我的團(tuán)隊(duì)已經(jīng)為融合這些技術(shù)開發(fā)了很多定制代碼,我對(duì)這樣的系統(tǒng)設(shè)計(jì)和運(yùn)營(yíng)很不滿意,于是離開那里,成為了ContainerShip的聯(lián)合創(chuàng)始人。
顯然我可能帶有偏見,但我認(rèn)為ContainerShip非常棒,它可以幫你節(jié)省很多時(shí)間,減少很多痛苦。當(dāng)然,我不會(huì)強(qiáng)迫你去用它,同時(shí)我也會(huì)盡量避免將偏見帶入這篇文章中。
1.太多不確定因素
微服務(wù)和面向服務(wù)的體系模式,倡導(dǎo)將系統(tǒng)分隔成許多不同的、小的、松耦合的軟件模塊,而不是一個(gè)單一的整體。當(dāng)涉及到開發(fā)一個(gè)大型軟件項(xiàng)目時(shí),更容易將這些模塊分給不同的團(tuán)隊(duì),每個(gè)團(tuán)隊(duì)還可以用自己擅長(zhǎng)的技術(shù)來(lái)開發(fā)。
這種認(rèn)識(shí)甚至已經(jīng)滲透到了基礎(chǔ)設(shè)施的層面。取其精華,去其糟粕,這在理論上講行得通,但實(shí)踐過(guò)程中可能是個(gè)美麗的陷阱。
當(dāng)您的托管平臺(tái)是由一系列變動(dòng)的部件構(gòu)成,每個(gè)部件都是由開源項(xiàng)目或公司所維護(hù),就需要編寫大量的定制代碼來(lái)將其融合起來(lái)。而這些定制代碼,必須要自己維護(hù),并且當(dāng)問(wèn)題發(fā)生時(shí),你很難確定是哪一個(gè)組件的故障,可能也沒(méi)人能幫得上忙,因?yàn)樽寛F(tuán)隊(duì)成員學(xué)習(xí)大量的組件是非常耗時(shí)和困難的。如果API發(fā)生變化或新版本發(fā)布,你只能靠自己讓它繼續(xù)工作。
我最初是沿著這條路走的,一個(gè)基礎(chǔ)設(shè)施團(tuán)隊(duì),服務(wù)于數(shù)百個(gè)非常忙碌的服務(wù),最終以痛苦告終。
2.沒(méi)有高可用性
現(xiàn)在有幾個(gè)越來(lái)越受歡迎的開源項(xiàng)目,完全忽略了它們master服務(wù)器(編排管理剩余集群的服務(wù)器)的高可用性。可怕的是這些公司宣稱其產(chǎn)品是在生產(chǎn)環(huán)境中運(yùn)行Docker的***方式。如果集群管理系統(tǒng)不是高可用的,沒(méi)有l(wèi)eader election的概念,運(yùn)行在一臺(tái)單獨(dú)的服務(wù)器上,我不能想象這可以稱為生產(chǎn)級(jí)別的產(chǎn)品。無(wú)論選擇何種解決方案,請(qǐng)確保它支持多個(gè)master的高可用性,以及通過(guò)一些選舉機(jī)制來(lái)決定哪個(gè)master作為leader或者有很好的結(jié)束機(jī)制。
3.不開源
我曾因?yàn)榘褜毝級(jí)涸谝粋€(gè)非開源項(xiàng)目中,而非常痛苦。如果沒(méi)有類似經(jīng)歷的話,可能會(huì)覺(jué)得難以置信。以Genius上所紕漏的Heroku的丑聞為例,沒(méi)有人會(huì)想到,他們底層的托管平臺(tái)的文件會(huì)有造假,用戶則在被系統(tǒng)超長(zhǎng)的響應(yīng)時(shí)間所困擾。還有很多古怪事情發(fā)生在這些非開源的Docker管理系統(tǒng)。
4.非必要的網(wǎng)絡(luò)需求
現(xiàn)在有一個(gè)趨勢(shì)是通過(guò)overlay網(wǎng)絡(luò),為主機(jī)系統(tǒng)上的每個(gè)容器分配唯一的IP地址。這種方式帶來(lái)的***好處是易于使用,但隨之而來(lái)的是延遲和帶寬限制的成本。甚至一些最專業(yè)的container編排系統(tǒng)也在向用戶推銷這種方式。在新的實(shí)現(xiàn)中,事情得到了改善,但是降低性能來(lái)提高易用性的方法,并不是一個(gè)好主意。
另一種方式是“端口映射”,比如所有容器都運(yùn)行子啊隨機(jī)端口上,通過(guò)計(jì)算獲得流量的正確方向。好消息是,端口映射問(wèn)題并不是真的很難,你不需要限制你的性能。使用分布式架構(gòu)的目的是上提高性能,可用性和功能,不要因?yàn)殄e(cuò)誤的選擇反而破壞了性能。
5.托管核心業(yè)務(wù)
幾乎所有大型云供應(yīng)商都發(fā)布了自己的容器生產(chǎn)解決方案,比如AWS的EC2 Container Service,谷歌的Google ContainerEngine,Joyent的Triton等等。不幸的是(我的觀點(diǎn)),在容器托管服務(wù)商中運(yùn)行你的容器負(fù)載,會(huì)違背容器***的一個(gè)好處:可移植性。托管服務(wù)供應(yīng)商會(huì)想盡一切辦法留住你。過(guò)去你沒(méi)有太多選擇,只能糾結(jié)于配置管理系統(tǒng)和多個(gè)提供商的API?,F(xiàn)在情況已經(jīng)有所轉(zhuǎn)變,有了開放的和供應(yīng)商無(wú)關(guān)的選擇。我強(qiáng)烈建議不要使用一個(gè)不具有靈活性的系統(tǒng),而且與供應(yīng)商無(wú)關(guān)作為他們的主要目標(biāo)。
另一個(gè)選擇是“Docker as a Service”提供商,在他們自己的網(wǎng)絡(luò)上提供運(yùn)行所有重要的系統(tǒng),而且為你提供托管主機(jī)上簡(jiǎn)單的運(yùn)行獨(dú)立服務(wù)器,有客戶端連接到他們管理系統(tǒng)。但當(dāng)你不想再付錢給這些供應(yīng)商,或者他們的服務(wù)不再適應(yīng)于你業(yè)務(wù)的增長(zhǎng)時(shí),你是沒(méi)有辦法回退到免費(fèi)和開源的模式的。ContainerShip可以做到,當(dāng)您在CoutainerShip中啟動(dòng)一個(gè)集群,系統(tǒng)的核心運(yùn)行在您自己的服務(wù)器上,您可以隨時(shí)停止運(yùn)行在云服務(wù)中的工作,使用開源的核心系統(tǒng)。
6.強(qiáng)制的操作系統(tǒng)
我以前負(fù)責(zé)安全和PCI DSS協(xié)作,還要處理隨之而來(lái)的上百的監(jiān)控和審計(jì)要求,使用微型Linux操作系統(tǒng)是不行的,因?yàn)镮DS/日志/安全軟件,不適合在只能通過(guò)Docker安裝和運(yùn)行軟件的主機(jī)上使用??赡軐?duì)你來(lái)說(shuō)并不是一個(gè)問(wèn)題,但我希望能自由選擇操作系統(tǒng)。為什么要用一個(gè)指定的操作系統(tǒng)來(lái)使用Docker?或者為什么你需要利用一個(gè)初始化系統(tǒng)來(lái)運(yùn)行容器?我認(rèn)為這是你要極力避免的緊耦合。靈活性和多種Linux操作系統(tǒng)的支持非常重要,尤其是對(duì)于那些希望能夠繼續(xù)使用某些操作系統(tǒng)的企業(yè),因?yàn)樗麄円呀?jīng)在這個(gè)操作系統(tǒng)上投入了時(shí)間培訓(xùn),有一些服務(wù)部署在上面。
總結(jié)
以上只是我的建議,但它們來(lái)自于無(wú)數(shù)個(gè)小時(shí)的研究,開發(fā)和實(shí)踐中大規(guī)模運(yùn)行Docker的經(jīng)驗(yàn)。當(dāng)你計(jì)劃向容器和分布式系統(tǒng)遷移時(shí),請(qǐng)記住這些經(jīng)驗(yàn)。有時(shí)候,炒作會(huì)讓你走上一條路,從現(xiàn)在起6個(gè)月就沒(méi)辦法工作了。計(jì)算領(lǐng)域的技術(shù)更新非常迅速,但多年沉淀下來(lái)的***實(shí)踐不會(huì)改變。一定要相信你的直覺(jué),容器并不能使一個(gè)壞的解決方案變好。