Docker網(wǎng)絡(luò)管理的未來(lái):基于線程與基于事件的并發(fā)編程之爭(zhēng)
【寫在前面】作者是一個(gè)極客,從Docker的0.7版本開始就關(guān)注了Docker的網(wǎng)絡(luò)問(wèn)題,本文雖然帶有些感情色彩,但也不難看到作者對(duì)Docker的癡迷程度,不難看出他那顆想讓Docker更好的心。文章分析了Docker的網(wǎng)絡(luò)歷史,對(duì)相關(guān)的解決方案發(fā)表了自己的看法,作者期待Docker官方能做出最正確的決定。
最近有很多關(guān)于Docker網(wǎng)絡(luò)管理的討論,對(duì)這個(gè)問(wèn)題大家眾說(shuō)紛壇。引起爭(zhēng)論的主要原因是近年來(lái)使用Docker的人越來(lái)越多,用戶逐漸意識(shí)到Docker的網(wǎng)絡(luò)缺陷亟待解決。當(dāng)然,實(shí)際情況也是這樣,目前Docker的網(wǎng)絡(luò)能力嚴(yán)重不足,不支持復(fù)雜的設(shè)置,現(xiàn)在Docker的網(wǎng)絡(luò)模型存在性能問(wèn)題且不易擴(kuò)展。不過(guò)對(duì)于一個(gè)基本的應(yīng)用而言Docker的網(wǎng)絡(luò)模型已經(jīng)很不錯(cuò)了。然而,我們不能永遠(yuǎn)停留在使用“基本應(yīng)用”的級(jí)別上,伴隨著云計(jì)算和微服務(wù)的普及,這些還遠(yuǎn)遠(yuǎn)不夠。作為libcontainer的貢獻(xiàn)者之一,我想通過(guò)本文,發(fā)表一些自己的觀點(diǎn)。
首先我需要先聊聊一些和網(wǎng)絡(luò)相關(guān)背景知識(shí)。一開始的時(shí)候,Docker使用者和開發(fā)者就意識(shí)到Docker網(wǎng)絡(luò)模型的不足,因?yàn)樗麄冃枰oDocker容器分配更多的IP地址,而使用LXC作為容器引擎卻不會(huì)為這個(gè)問(wèn)題而感到苦惱。容器已經(jīng)存在了相當(dāng)長(zhǎng)一段時(shí)間,只是由于Docker的出現(xiàn)好多人才去學(xué)習(xí)Linux的命名空間(namespace),包括網(wǎng)絡(luò)的命名空間,它是Linux容器網(wǎng)絡(luò)的基石。Docker Tinkerer Extraordinaire 寫了很多的博客并開發(fā)了pipework工具,它可以幫助了解Docker的網(wǎng)絡(luò)以及如何在Docker中構(gòu)建復(fù)雜網(wǎng)絡(luò)。雖然pipework很強(qiáng)大,但它也僅僅只是一個(gè)第三方的工具罷了,我們希望Docker原生的支持。
我從Docker 0.7版本開始就關(guān)注它的網(wǎng)絡(luò)問(wèn)題了,但我并不是直接一頭扎進(jìn)源碼里研究。相反,我首先嘗試研究LXC網(wǎng)絡(luò),我希望它可以幫助我找到問(wèn)題的關(guān)鍵點(diǎn)并運(yùn)用到Docker上。我聯(lián)系了Jerome并且對(duì)在未來(lái)在Docker中嵌入golang-pipwork hack達(dá)成了共識(shí)。接下來(lái)就是個(gè)漫長(zhǎng)的故事。時(shí)間過(guò)去七個(gè)月了,我們并沒(méi)有在Docker-network-land這個(gè)項(xiàng)目上投入太多的精力,在GitHub上也鮮有人討論網(wǎng)絡(luò)相關(guān)的問(wèn)題。當(dāng)我打開那些需要解決的問(wèn)題的鏈接的時(shí)候,我覺(jué)得是時(shí)候需要改變了。Docker們關(guān)心的是那些優(yōu)先級(jí)比較高的問(wèn)題因?yàn)槲覀円呀?jīng)有了pipework以及pipework衍生的工具。與此同時(shí),越來(lái)越多的實(shí)用性工具使得我們能突破Docker的網(wǎng)絡(luò)局限。人們不再關(guān)心Docker的網(wǎng)絡(luò)問(wèn)題,而只是通過(guò)一小部分人修復(fù)那些已經(jīng)存在的問(wèn)題并添加一些新功能。
轉(zhuǎn)眼過(guò)了幾個(gè)月的時(shí)間,我們最終決定開始改變現(xiàn)狀。我們向官方提出了網(wǎng)絡(luò)方面的建議并建立了一個(gè)關(guān)于libnetwork的聊天室,盡管這些距離我們某些不成熟的想法有些遙遠(yuǎn)?,F(xiàn)在參與討論的人越來(lái)越多。在我的觀點(diǎn)看來(lái),這對(duì)Docker來(lái)說(shuō)是至關(guān)重要的。值得欣慰的是社區(qū)里很多人也開始意識(shí)到這個(gè)問(wèn)題。
Docker的網(wǎng)絡(luò)問(wèn)題是極其復(fù)雜的,包括表面的和深層次的。它會(huì)涉及到非常多的項(xiàng)目,小到本地開發(fā)環(huán)境,大到類似牛逼的Kubernetes項(xiàng)目。當(dāng)你閱讀了Kubernates關(guān)于網(wǎng)絡(luò)方面的設(shè)計(jì)文檔后,你會(huì)發(fā)現(xiàn)一些好點(diǎn)子。在過(guò)去的一年時(shí)間里,我們開發(fā)了很多工具和類庫(kù)去解決網(wǎng)路問(wèn)題。我真的希望正在進(jìn)行的討論不會(huì)影響(fuck)到我們現(xiàn)有的工作,而是能夠?yàn)樾氯藙?chuàng)造更好的環(huán)境。我之所以使用Fuck這個(gè)詞是因?yàn)槲以娮R(shí)過(guò)一個(gè)壞決定是如何讓所有人失望的,這也是我對(duì)Docker的一點(diǎn)擔(dān)心。也許這些都只是人生經(jīng)歷罷了,正如俗語(yǔ)有云:歷史交不給我們什么,所以我只是替古人擔(dān)憂罷了。
對(duì)于我來(lái)說(shuō)Docker不僅僅意味著軟件交付,不僅僅意味著DevOps。它是另一種開發(fā)工具。對(duì)我而言,Docker應(yīng)該是一個(gè)工具,而且也許更重要的是一個(gè)平臺(tái)。嗯,是開放平臺(tái),并且不是我們經(jīng)常討論的那種軟件平臺(tái)。如果Docker準(zhǔn)備讓用戶或者公司在現(xiàn)有的平臺(tái)上構(gòu)建其解決方案,那它就不應(yīng)該依賴其它項(xiàng)目。我希望官方不會(huì)這樣做,因?yàn)镈ocker的伙計(jì)們已經(jīng)知道擺脫依賴LXC并使用自己的libcontainer項(xiàng)目來(lái)替代。類似的處理思路應(yīng)該用到網(wǎng)絡(luò)問(wèn)題的上。
目前看到有一些計(jì)劃是打算將OVS項(xiàng)目關(guān)聯(lián)到Docker上來(lái),從Linux Kernel 3.3開始,OVS項(xiàng)目就是內(nèi)核的一部分。當(dāng)我聽到這個(gè)的時(shí)候我覺(jué)得是不是腦袋讓驢踢了。首先聲明我并不是反對(duì)使用OVS,實(shí)際上,它是一個(gè)非常不錯(cuò)的網(wǎng)絡(luò)工具套件。它的設(shè)置比較復(fù)雜,對(duì)于新手來(lái)說(shuō)有一個(gè)陡峭的學(xué)習(xí)曲線,但是一旦學(xué)會(huì),OVS就可以幫你事半功倍。關(guān)于這個(gè)話題我聽到的一個(gè)討論是:“如果OVS工作在Docker上,那么工作一切都變得很美好”。讓我告訴你,親們:如果讓我花費(fèi)大量時(shí)間學(xué)習(xí)它,***的結(jié)果只能是:“還好,可以用”。我并不想說(shuō)的那么憤世嫉俗,實(shí)際情況是在某些常用環(huán)境下OVS會(huì)崩潰。因此,使用OVS只是一種瘋狂的想法罷了。我并不想大家都認(rèn)同我的說(shuō)法。是的,你可以什么都不做,也可以把他當(dāng)做日?;A(chǔ)工作。你可以讓系統(tǒng)管理員和網(wǎng)絡(luò)工程師很開心,但是不全是這樣,同時(shí)也會(huì)讓開發(fā)者很孤獨(dú)。這是一個(gè)復(fù)雜的話題,當(dāng)然解決問(wèn)題并非只有一種方法(沒(méi)有銀彈),所以我們不奢望真的有銀彈罷了。
這個(gè)帖子并不是討論是否將OVS成為Docker的一部分。我選擇談到OVS是因?yàn)?,這可能是解決Docker網(wǎng)絡(luò)問(wèn)題的方案之一。我們討論的范圍有且不限于Docker的第三方項(xiàng)目,無(wú)論它是否開源。截止到目前,Docker們已經(jīng)做了一些工作去避免這種問(wèn)題的出現(xiàn)。很重要的一點(diǎn)是我們之前談到的問(wèn)題:避免對(duì)某個(gè)項(xiàng)目的依賴。一旦你決定使用某個(gè)項(xiàng)目,你的注意力就不得不集中在避免損害已經(jīng)作為有機(jī)整體的平臺(tái)構(gòu)建項(xiàng)目的相互依賴的問(wèn)題上。正如我們現(xiàn)在討論的項(xiàng)目例如 flannel、weave、docket等,還有更多的新增的項(xiàng)目平臺(tái)帶來(lái)的眾多依賴項(xiàng)目上。
目前有一個(gè)基于可插拔的網(wǎng)絡(luò)后端設(shè)置看起來(lái)是個(gè)不錯(cuò)的建議。但是這還需要一點(diǎn)時(shí)間,直到有基于硬件的可插拔的架構(gòu)設(shè)計(jì)而不僅僅是解決網(wǎng)絡(luò)問(wèn)題,還更多的Docker參與和時(shí)間的檢驗(yàn)。這個(gè)改變發(fā)生在Docker的核心,目前正在從移動(dòng)終端轉(zhuǎn)移到網(wǎng)絡(luò)部分。我認(rèn)為,給Docker們建立一個(gè)健壯的默認(rèn)的后臺(tái),而不是給用戶一些列的解決方案,強(qiáng)迫他們使用固定的路徑,是一個(gè)比較穩(wěn)妥的做法。不可避免的我們會(huì)對(duì)其他項(xiàng)目引用和依賴,這將不會(huì)影響目前的Docker用戶,并且不會(huì)給未來(lái)的Docker用戶帶來(lái)影響。我們都明白不可能讓每個(gè)人都滿意,但是你可以創(chuàng)建一個(gè)友好的環(huán)境,用來(lái)建立自己的解決方案,這樣使得不同用戶可以共同工作而不會(huì)相互影響。如果你和我一樣加入可插拔的API項(xiàng)目,那么我們就是在同一條船上的人了。
說(shuō)起Docker網(wǎng)絡(luò)的未來(lái),我真的很興奮,我非常期待Docker能做出最正確的決定。最重要的是,我希望本文能激發(fā)更多的人能參與其中一同完善這個(gè)項(xiàng)目。