版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1容器平臺(tái)網(wǎng)絡(luò)模型1.1容器網(wǎng)絡(luò)概述與傳統(tǒng)的虛擬化相比,容器其生命周期更短、數(shù)量密度更高、集群變更速度更快?;谶@些特性,容器平臺(tái)網(wǎng)絡(luò)就必須對(duì)集群節(jié)點(diǎn)之間的高速通信進(jìn)行充分的考量。除此之外,在企業(yè)級(jí)的容器云平臺(tái)上,承載眾多租戶的計(jì)算負(fù)載之間資源的安全隔離,也必須要考慮到的因素。顯而易見,傳統(tǒng)的物理網(wǎng)絡(luò)架構(gòu)無法滿足容器平臺(tái)高靈活性的需求,容器平臺(tái)網(wǎng)絡(luò)構(gòu)建必須要有一種嶄新的設(shè)計(jì)架構(gòu)來滿足,這便推動(dòng)了容器平臺(tái)網(wǎng)絡(luò)設(shè)計(jì)的發(fā)展。容器網(wǎng)絡(luò)發(fā)展到目前,已經(jīng)形成了Docker主導(dǎo)的CNM模型和Google、CoreOS、Kubernetes主導(dǎo)的CNI模型兩種模型共存的情況。CNM和CNI并不是網(wǎng)絡(luò)實(shí)現(xiàn),他們是網(wǎng)絡(luò)規(guī)范和網(wǎng)絡(luò)體系。從研發(fā)的角度來看就是一些接口,主要是和網(wǎng)絡(luò)管理相關(guān)的問題。容器平臺(tái)的網(wǎng)絡(luò)方案,通??梢詮膮f(xié)議棧、穿越方式、隔離方法三個(gè)維度去設(shè)計(jì)方案:圖1網(wǎng)絡(luò)架構(gòu)示意圖協(xié)議棧:二層(橋接、ARP+MAC)三層(路由轉(zhuǎn)發(fā))二層+三層(節(jié)點(diǎn)內(nèi)部二層轉(zhuǎn)發(fā)、跨節(jié)點(diǎn)三層轉(zhuǎn)發(fā))穿越方式:Overlay(隧道穿越底層基礎(chǔ)設(shè)施)Underlay(直接穿越底層基礎(chǔ)設(shè)施)隔離方法:VLANVXLAN1.2容器網(wǎng)絡(luò)分類介紹1.2.1協(xié)議棧二層解決方案,常見于傳統(tǒng)機(jī)房或者虛擬化場(chǎng)景中,針對(duì)ARP和MAC(橋接模式)學(xué)習(xí),廣播風(fēng)暴是這個(gè)方案最核心要解決的問題。眾所周知,二層廣播,對(duì)整個(gè)集群中節(jié)點(diǎn)的數(shù)量也會(huì)有嚴(yán)格的限制。三層解決方案一般是基于BGP協(xié)議實(shí)現(xiàn)路由轉(zhuǎn)發(fā),通過自主學(xué)習(xí)完善整個(gè)數(shù)據(jù)中心的路由狀態(tài)。這個(gè)方案的優(yōu)勢(shì)是IP穿透性,可以實(shí)現(xiàn)IP網(wǎng)絡(luò)透?jìng)鳌R驗(yàn)榛贗P,所以其優(yōu)勢(shì)在于規(guī)模性,具有非常優(yōu)秀的擴(kuò)展性。但在實(shí)際使用過程中,受限于各個(gè)企業(yè)自身網(wǎng)絡(luò)安全的考量,例如生產(chǎn)網(wǎng)和開發(fā)測(cè)試網(wǎng)隔離,或者網(wǎng)絡(luò)本身不支持BGP,那么這個(gè)方案就受限了。二層+三層的方案,集成了前面兩種方案的優(yōu)勢(shì)(既解決了二層規(guī)模性擴(kuò)展的問題,又解決三層網(wǎng)絡(luò)隔離受限的問題),正成為容器云網(wǎng)絡(luò)場(chǎng)景下首選的協(xié)議棧層級(jí)的解決方案。1.2.2穿越方式Underlay網(wǎng)絡(luò)提到Underlay網(wǎng)絡(luò),就必須從以太網(wǎng)說起,以太網(wǎng)從最開始設(shè)計(jì)出來就是一個(gè)分布式網(wǎng)絡(luò),沒有中心的控制節(jié)點(diǎn),網(wǎng)路中的各個(gè)設(shè)備之間通過協(xié)議傳遞的方式學(xué)習(xí)網(wǎng)絡(luò)的可達(dá)信息,由每臺(tái)設(shè)備自己決定要如何轉(zhuǎn)發(fā),這直接導(dǎo)致了沒有整體觀念,不能從整個(gè)網(wǎng)絡(luò)的角度對(duì)流量進(jìn)行調(diào)控。由于要完成所有網(wǎng)絡(luò)設(shè)備之間的互通,就必須使用通用的語言,這就是網(wǎng)絡(luò)協(xié)議,RFC就是網(wǎng)絡(luò)協(xié)議的法律,相當(dāng)于國(guó)際法,各個(gè)設(shè)備供應(yīng)商遵從國(guó)際法行事,就基本保證了整個(gè)網(wǎng)絡(luò)世界的正常運(yùn)行。Underlay就是當(dāng)前數(shù)據(jù)中心網(wǎng)路基礎(chǔ)轉(zhuǎn)發(fā)架構(gòu)的網(wǎng)絡(luò),只要數(shù)據(jù)中心網(wǎng)絡(luò)上任意兩點(diǎn)路由可達(dá)即可,指的是物理基礎(chǔ)層。我們可以通過物理網(wǎng)絡(luò)設(shè)備本身的技術(shù)改良、擴(kuò)大設(shè)備數(shù)量、帶寬規(guī)模等完善Underlay網(wǎng)絡(luò),其包含了一切現(xiàn)有的傳統(tǒng)網(wǎng)絡(luò)技術(shù)。Overlay網(wǎng)絡(luò)Overlay技術(shù)可以分為網(wǎng)絡(luò)Overlay,主機(jī)Overlay和混合式Overlay三大類。網(wǎng)絡(luò)Overlay是指通過控制協(xié)議對(duì)邊緣的網(wǎng)絡(luò)設(shè)備進(jìn)行網(wǎng)絡(luò)構(gòu)建和擴(kuò)展,也就是本文所講的Overlay網(wǎng)絡(luò)技術(shù)。Overlay網(wǎng)絡(luò)技術(shù)多種多樣,一般采用TRILL、VXLAN、GRE、NVGRE等隧道技術(shù)。TRILL(TransparentInterconnectionofLotsofLinks)技術(shù)是電信設(shè)備廠商主推的新型環(huán)網(wǎng)技術(shù);NVGRE(NetworkVirtualizationusingGenericRoutingEncapsulation)STT(StatelessTransportTunnelingProtocol)是IT廠商主推的Overlay技術(shù);以及大家非常熟悉的LAN)等基于隧道的封裝技術(shù)。由于這些也都是新增的協(xié)議,均需要升級(jí)現(xiàn)有網(wǎng)絡(luò)設(shè)備才能支持。Overlay網(wǎng)絡(luò)中應(yīng)用部署的位置將不受限制,網(wǎng)絡(luò)設(shè)備可即插即用、自動(dòng)配置下發(fā),自動(dòng)運(yùn)行,Overlay網(wǎng)絡(luò)業(yè)務(wù)變化,基礎(chǔ)網(wǎng)絡(luò)不感知,并對(duì)傳統(tǒng)網(wǎng)絡(luò)改造極少,最為重要的是虛擬機(jī)和物理服務(wù)器都可以接入Overlay網(wǎng)絡(luò)中。1.2.3根據(jù)基礎(chǔ)設(shè)施劃分VLAN(VirtualLocalAreaNetwork)意為虛擬局域網(wǎng),是在交換機(jī)實(shí)現(xiàn)過程中涉及到的概念,由802.1Q標(biāo)準(zhǔn)所定義。由于交換機(jī)是工作在鏈路層的網(wǎng)絡(luò)設(shè)備,連接在同一臺(tái)交換機(jī)的終端處于同一個(gè)三層網(wǎng)中,同時(shí)也處于同一個(gè)廣播域。當(dāng)交換機(jī)接入較多的終端時(shí),任意一臺(tái)終端發(fā)送廣播報(bào)文時(shí)(例如:ARP請(qǐng)求),報(bào)文都會(huì)傳遍整個(gè)網(wǎng)絡(luò)。對(duì)于規(guī)模較大的組網(wǎng)場(chǎng)景,廣播報(bào)文的泛濫對(duì)于網(wǎng)絡(luò)通信將會(huì)造成較大的影響。VLAN技術(shù)為這一問題提供了解決方案,VLAN將同一網(wǎng)絡(luò)劃分為多個(gè)邏輯上的虛擬子網(wǎng),并規(guī)定當(dāng)收到廣播報(bào)文時(shí),僅僅在其所在VLAN中進(jìn)行廣播從而防止廣播報(bào)文泛濫。VLAN技術(shù)在鏈路層的層次中實(shí)現(xiàn)了廣播域的隔離。隨著大數(shù)據(jù)、云計(jì)算技術(shù)的興起以及虛擬化技術(shù)的普及,VLAN技術(shù)的弊端逐漸顯現(xiàn)出來,具體表現(xiàn)為如下3個(gè)方面:(1)虛擬化技術(shù)的發(fā)展促使大數(shù)據(jù)、云計(jì)算技術(shù)公司采用單個(gè)物理設(shè)備虛擬多臺(tái)虛擬機(jī)的方式來進(jìn)行組網(wǎng),隨著應(yīng)用模塊的增加,對(duì)于支持VLAN數(shù)目的要求也在提升,802.1Q標(biāo)準(zhǔn)中的最多支持4094個(gè)VLAN的能力已經(jīng)無法滿足當(dāng)下需求。(2)公有云提供商的業(yè)務(wù)要求將實(shí)體網(wǎng)絡(luò)租借給多個(gè)不同的用戶,這些用戶對(duì)于網(wǎng)絡(luò)的要求有所不同,而不同用戶租借的網(wǎng)絡(luò)有很大的可能會(huì)出現(xiàn)IP地址、MAC地址的重疊,傳統(tǒng)的VLAN僅僅解決了同一鏈路層網(wǎng)絡(luò)廣播域隔離的問題,而并沒有涉及到網(wǎng)絡(luò)地址重疊的問題,因此需要一種新的技術(shù)來保證在多個(gè)租戶網(wǎng)絡(luò)中存在地址重疊的情況下依舊能有效通信的技術(shù)。(3)虛擬化技術(shù)的出現(xiàn)增加了交換機(jī)的負(fù)擔(dān),對(duì)于大型的數(shù)據(jù)中心而言,單臺(tái)交換機(jī)必須支持?jǐn)?shù)十臺(tái)以上主機(jī)的通信連接才足以滿足應(yīng)用需求,而虛擬化技術(shù)使得單臺(tái)主機(jī)可以虛擬化出多臺(tái)虛擬機(jī)同時(shí)運(yùn)行,而每臺(tái)虛擬機(jī)都會(huì)有其唯一的MAC地址。這樣,為了保證集群中所有虛機(jī)可以正常通信,交換機(jī)必須保存每臺(tái)虛機(jī)的MAC地址,這樣就導(dǎo)致了交換機(jī)中的MAC表異常龐大,從而影響交換機(jī)的轉(zhuǎn)發(fā)性能。基于以上需求,VXLAN技術(shù)被提出。VXLAN技術(shù)是網(wǎng)絡(luò)Overlay技術(shù)的一種實(shí)現(xiàn),對(duì)于Overlay技術(shù),筆者的理解是:在基于物理網(wǎng)絡(luò)拓?fù)涞幕A(chǔ)上通過一定的技術(shù)來構(gòu)建虛擬的、不同于物理網(wǎng)絡(luò)拓?fù)涞倪壿嬀W(wǎng)絡(luò),而物理網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)對(duì)于Overlay終端而言是透明的,終端不會(huì)感知到物理網(wǎng)絡(luò)的存在,而僅僅能感知到邏輯網(wǎng)絡(luò)結(jié)構(gòu)。對(duì)于終端的視角,網(wǎng)絡(luò)的情況和直接通過物理設(shè)備實(shí)現(xiàn)邏輯拓?fù)涞男Ч窍嗤摹XLAN技術(shù)可以基于三層網(wǎng)絡(luò)結(jié)構(gòu)來構(gòu)建二層虛擬網(wǎng)絡(luò),通過VLAN技術(shù)可以將處于不同網(wǎng)段網(wǎng)絡(luò)設(shè)備整合在同一個(gè)邏輯鏈路層網(wǎng)絡(luò)中,對(duì)于終端用戶而言,這些網(wǎng)絡(luò)設(shè)備似乎“真實(shí)地”部署在了同一個(gè)鏈路層網(wǎng)絡(luò)中。相比VLAN技術(shù),VXLAN技術(shù)具有以下的優(yōu)勢(shì):(1)24位長(zhǎng)度的VNI字段值可以支持更多數(shù)量的虛擬網(wǎng)絡(luò),解決了VLAN數(shù)目上限為4094的局限性的問題。(2)VXLAN技術(shù)通過隧道技術(shù)在物理的三層網(wǎng)絡(luò)中虛擬二層網(wǎng)絡(luò),處于VXLAN網(wǎng)絡(luò)的終端無法察覺到VXLAN的通信過程,這樣也就使得邏輯網(wǎng)絡(luò)拓?fù)浜臀锢砭W(wǎng)絡(luò)拓?fù)鋵?shí)現(xiàn)了一定程度的解耦,網(wǎng)絡(luò)拓?fù)涞呐渲脤?duì)于物理設(shè)備的配置的依賴程度有所降低,配置更靈活更方便。(3)VLAN技術(shù)僅僅解決了二層網(wǎng)絡(luò)廣播域分割的問題,而VXLAN技術(shù)還具有多租戶支持的特性,通過VXLAN分割,各個(gè)租戶可以獨(dú)立組網(wǎng)、通信,地址分配方面和多個(gè)租戶之間地址沖突的問題也得到了解決。1.3總結(jié)通過本章的學(xué)習(xí),可以初步了解容器網(wǎng)絡(luò)相關(guān)的基礎(chǔ)概念,主要涉及到了容器網(wǎng)絡(luò)的協(xié)議棧、穿越方式以及隔離方式。針對(duì)協(xié)議棧,到底是采用二層互通,還是采用三層互通,還是結(jié)合兩種方式的優(yōu)點(diǎn)整合一個(gè)綜合的方式取決于業(yè)務(wù)場(chǎng)景;針對(duì)穿越方式,是采用傳統(tǒng)的Underlay網(wǎng)絡(luò),還是基于SDN的Overlay網(wǎng)絡(luò),和客戶現(xiàn)場(chǎng)情況,以及硬件設(shè)備支持的情況都有比較大的關(guān)聯(lián);同樣,隔離方式采用VLAN還是VXLAN,也和場(chǎng)景強(qiáng)相關(guān)。由此可見,容器云網(wǎng)絡(luò)的設(shè)計(jì),需要因地制宜,因材施教,從客戶需求以及現(xiàn)場(chǎng)情況發(fā)出,才能制定出一個(gè)完善的解決方案。2基于Docker網(wǎng)絡(luò)基礎(chǔ)和實(shí)現(xiàn)原理Docker網(wǎng)絡(luò)方案基于OpenStack平臺(tái)網(wǎng)絡(luò)解決方案,在不斷的摸索中,形成了自己的一套網(wǎng)絡(luò)模型。Docker網(wǎng)絡(luò)在整個(gè)Docker技術(shù)棧中的位置如圖:圖2Docker生態(tài)技術(shù)棧在容器網(wǎng)絡(luò)項(xiàng)目探索中,隨著容器的發(fā)展,容器網(wǎng)絡(luò)的發(fā)展也出現(xiàn)了分歧。主要分為兩派,一個(gè)是Docker原生的CNM(ContainerNetworkModel),另一個(gè)是兼容性更好的CNI(ContainerNetworkInterface)。CNI就是后來為Kubernetes等容器平臺(tái)廣泛推崇使用的接口技術(shù),后面的章節(jié)會(huì)詳細(xì)講述。這里,我們簡(jiǎn)要介紹CNM。原先Docker的網(wǎng)絡(luò)相關(guān)的代碼是直接在Docker中的,網(wǎng)絡(luò)功能也比較簡(jiǎn)單,對(duì)網(wǎng)絡(luò)的詬病也是比較多。隨著Docker越來越向平臺(tái)化發(fā)展,將功能組件逐漸從Docker中解耦,Docker從1.7把網(wǎng)絡(luò)相關(guān)的代碼從Docker的代碼中剝離出來新建了一個(gè)Libnetwork項(xiàng)目,引入了CNM的網(wǎng)絡(luò)模型。圖3CNM(ContainerNetworkModel)CNM模型下的Docker網(wǎng)絡(luò)模型如上所示。它由Sandbox,Endpoint,Network三種組件組成。注意,該模型只是規(guī)定了三種組件各自的作用,他們都有各自的具體實(shí)現(xiàn)方式。Sandbox:Sandbox包含了一個(gè)Container的網(wǎng)絡(luò)相關(guān)的配置,如網(wǎng)卡Interface,路由表等。Sandbox在Linux上的典型實(shí)現(xiàn)是Network
namespace。在Linux系統(tǒng)上的Docker環(huán)境中,Container,Networknamespace,Sandbox這三者是綁定在一起的。一個(gè)Sandbox可以包含多個(gè)Endpoint,這些Endpoint可以來自多個(gè)Network。Endpoint:Sandbox加入Network的方式是通過Endpoint完成的。Endpoint的典型實(shí)現(xiàn)方式是Vethpair,每個(gè)Endpoint都是由某個(gè)Network創(chuàng)建。創(chuàng)建后,它就歸屬于該Network。同時(shí),Endpoint還可以加入一個(gè)Sandbox。加入后,相當(dāng)于該Sandbox也加入了此Network。Network:Network的一種典型實(shí)現(xiàn)是Linuxbridge。一個(gè)Network可以創(chuàng)建多個(gè)Endpoint。將這些Endpoint加入到Sandbox,即實(shí)現(xiàn)了多個(gè)Sandbox的互通。總結(jié)起來:如果要想兩個(gè)Container之間可以直接通信,那么最簡(jiǎn)單的辦法就是由一個(gè)Network創(chuàng)建兩個(gè)Endpoint,分別加入這兩個(gè)Container對(duì)應(yīng)的Sandbox。注意:不同Network之間默認(rèn)的隔離性是docker通過設(shè)置Iptables完成的,通過改變Iptables的設(shè)置,可以使得兩個(gè)Network互通。標(biāo)準(zhǔn)的Docker網(wǎng)絡(luò)支持以下4類網(wǎng)絡(luò)模式:host模式:使用--net=host指定container模式:使用--net=container:Name_or_ID指定none模式:使用--net=none指定bridge模式:使用--net=bridge指定,設(shè)為默認(rèn)值橋接模式是最常見的Docker容器網(wǎng)絡(luò)類型。在橋接模式下,Docker會(huì)為每個(gè)容器分配IP地址及創(chuàng)建虛擬以太網(wǎng)網(wǎng)卡對(duì)(Veth)。所有的容器都被連接到Docker在主機(jī)綁定的橋接設(shè)備上。被連接到同一個(gè)橋接設(shè)備的所有容器,都可以實(shí)現(xiàn)互聯(lián)互通。如果容器要對(duì)外界提供服務(wù),則用戶需要將容器內(nèi)的服務(wù)端口與宿主機(jī)的某一端口綁定。這樣所有訪問宿主機(jī)目標(biāo)端口的請(qǐng)求都將通過Docker代理轉(zhuǎn)發(fā)到容器的服務(wù)端,最終到達(dá)應(yīng)用。除了橋接模式,Docker也支持主機(jī)(host)模式,讓容器直接使用宿主機(jī)的網(wǎng)絡(luò)設(shè)備。宿主機(jī)模式使得容器占用宿主機(jī)的端口資源,而且要求容器具有更高的權(quán)限,因此只有特殊需求的容器,才會(huì)使用這種模式,如OpenShift集群中的Router組件。Router主機(jī)需要監(jiān)聽計(jì)算節(jié)點(diǎn)上的端口,以接受外部的請(qǐng)求,因此Router組件的Pod的容器網(wǎng)絡(luò)為主機(jī)模式。本章節(jié)主要介紹了Docker網(wǎng)絡(luò)的情況,從Docker整個(gè)生態(tài)棧入手,分析了基于單機(jī)和集群兩種不同場(chǎng)景的Docker網(wǎng)絡(luò),著重分析了在單機(jī)模式下Docker網(wǎng)絡(luò)的情況(host/bridge/none/container)。3Kubernetes網(wǎng)絡(luò)場(chǎng)景分析在實(shí)際的業(yè)務(wù)場(chǎng)景中,業(yè)務(wù)組件之間的關(guān)系十分復(fù)雜,特別是微服務(wù)概念的提出,應(yīng)用部署的粒度更加細(xì)小和靈活。為了支持業(yè)務(wù)應(yīng)用組件的通信聯(lián)系,Kubernetes網(wǎng)絡(luò)的設(shè)計(jì)主要致力于解決以下場(chǎng)景:(1)緊密耦合的容器到容器之間的直接通信;(2)抽象的Pod到Pod之間的通信;(3)Pod到Service之間的通信;(4)集群外部與內(nèi)部組件之間的通信;3.1容器到容器的通信在同一個(gè)Pod內(nèi)的容器(Pod內(nèi)的容器是不會(huì)跨宿主機(jī)的)共享同一個(gè)網(wǎng)絡(luò)命名空間,共享同一個(gè)Linux協(xié)議棧。所以對(duì)于網(wǎng)絡(luò)的各類操作,就和它們?cè)谕慌_(tái)機(jī)器上一樣,它們甚至可以用localhost地址訪問彼此的端口。這么做的結(jié)果是簡(jiǎn)單、安全和高效,也能減少將已經(jīng)存在的程序從物理機(jī)或者虛擬機(jī)移植到容器的難度。如圖4中的陰影部分就是Node上運(yùn)行著的一個(gè)Pod實(shí)例。容器1和容器2共享了一個(gè)網(wǎng)絡(luò)的命名空間,共享一個(gè)命名空間的結(jié)果就是它們好像在一臺(tái)機(jī)器上運(yùn)行似的,它們打開的端口不會(huì)有沖突,可以直接用Linux的本地IPC進(jìn)行通信。它們之間互相訪問只需要使用localhost就可以。圖4
容器到容器間通信3.2Pod之間的通信每一個(gè)Pod都有一個(gè)真實(shí)的全局IP地址,同一個(gè)Node內(nèi)的不同Pod之間可以直接采用對(duì)方Pod的IP地址通信,而不需要使用其他發(fā)現(xiàn)機(jī)制,例如DNS、Consul或者etcd。Pod既有可能在同一個(gè)Node上運(yùn)行,也有可能在不用的Node上運(yùn)行,所以通信也分為兩類:同一個(gè)Node內(nèi)的Pod之間的通信和不同Node上的Pod之間的通信。1)同一個(gè)Node內(nèi)的Pod之間的通信圖5同一個(gè)Node內(nèi)的Pod關(guān)系如圖,可以看出,Pod1和Pod2都是通過Veth連接在同一個(gè)Docker0網(wǎng)橋上的,它們的IP地址IP1、IP2都是從Docker0的網(wǎng)段上自動(dòng)獲取的,它們和網(wǎng)橋本身的IP3是同一個(gè)網(wǎng)段的。另外,在Pod1、Pod2的Linux協(xié)議棧上,默認(rèn)路由都是Docker0的地址,也就是說所有非本地的網(wǎng)絡(luò)數(shù)據(jù),都會(huì)被默認(rèn)發(fā)送到Docker0網(wǎng)橋上,由Docker0網(wǎng)橋直接中轉(zhuǎn),它們之間是可以直接通信的。2)不同Node上的Pod之間的通信Pod的地址是與Docker0在同一個(gè)網(wǎng)段內(nèi)的,我們知道Docker0網(wǎng)段與宿主機(jī)網(wǎng)卡是兩個(gè)完全不同的IP網(wǎng)段,并且不同Node之間的通信只能通過宿主機(jī)的物理網(wǎng)卡進(jìn)行,因此要想實(shí)現(xiàn)位于不同Node上的Pod容器之間的通信,就必須想辦法通過主機(jī)的這個(gè)IP地址來進(jìn)行尋址和通信。另外一方面,這些動(dòng)態(tài)分配且藏在Docker0之后的所謂“私有”IP地址也是可以找到的。Kubernetes會(huì)記錄所有正在運(yùn)行Pod的IP分配信息,并將這些信息保存在etcd中(作為Service的Endpoint)。這些私有IP信息對(duì)于Pod到Pod的通信也是十分重要的,因?yàn)槲覀兊木W(wǎng)絡(luò)模型要求Pod到Pod使用私有IP進(jìn)行通信。之前提到,Kubernetes的網(wǎng)絡(luò)對(duì)Pod的地址是平面的和直達(dá)的,所以這些Pod的IP規(guī)劃也很重要,不能有沖突。綜上所述,想要支持不同Node上的Pod之間的通信,就要達(dá)到兩個(gè)條件:(1)在整個(gè)Kubernetes集群中對(duì)Pod分配進(jìn)行規(guī)劃,不能有沖突;(2)找到一種辦法,將Pod的IP和所在Node的IP關(guān)聯(lián)起來,通過這個(gè)關(guān)聯(lián)讓Pod可以互相訪問。根據(jù)條件1的要求,我們需要在部署Kubernetes的時(shí)候,對(duì)Docker0的IP地址進(jìn)行規(guī)劃,保證每一個(gè)Node上的Docker0地址沒有沖突。我們可以在規(guī)劃后手工分配到每個(gè)Node上,或者做一個(gè)分配規(guī)則,由安裝的程序自己去分配占用。例如Kubernetes的網(wǎng)絡(luò)增強(qiáng)開源軟件Flannel就能夠管理資源池的分配。根據(jù)條件2的要求,Pod中的數(shù)據(jù)在發(fā)出時(shí),需要有一個(gè)機(jī)制能夠知道對(duì)方Pod的IP地址掛在哪個(gè)具體的Node上。也就是說要先找到Node對(duì)應(yīng)宿主機(jī)的IP地址,將數(shù)據(jù)發(fā)送到這個(gè)宿主機(jī)的網(wǎng)卡上,然后在宿主機(jī)上將相應(yīng)的數(shù)據(jù)轉(zhuǎn)到具體的Docker0上。一旦數(shù)據(jù)到達(dá)宿主機(jī)Node,則哪個(gè)Node內(nèi)部的Docker0便知道如何將數(shù)據(jù)發(fā)送到Pod。具體情況,如下圖所示。圖6跨Node的Pod通信在圖6中,IP1對(duì)應(yīng)的是Pod1,IP2對(duì)應(yīng)的是Pod2。Pod1在訪問Pod2時(shí),首先要將數(shù)據(jù)從源Node的eth0發(fā)送出去,找到并到達(dá)Node2的eth0。也就是說先要從IP3到IP4,之后才是IP4到IP2的送達(dá)。3.3Pod到Service之間的通信為了支持集群的水平擴(kuò)展、高可用,Kubernetes抽象出Service的概念。Service是對(duì)一組Pod的抽象,它會(huì)根據(jù)訪問策略(LB)來訪問這組Pod。Kubernetes在創(chuàng)建服務(wù)時(shí)會(huì)為服務(wù)分配一個(gè)虛擬的IP地址,客戶端通過訪問這個(gè)虛擬的IP地址來訪問服務(wù),而服務(wù)則負(fù)責(zé)將請(qǐng)求轉(zhuǎn)發(fā)到后端的Pod上。這個(gè)類似于反向代理,但是,和普通的反向代理有一些不同:首先它的IP地址是虛擬的,想從外面訪問需要一些技巧;其次是它的部署和啟停是Kubernetes統(tǒng)一自動(dòng)管理的。Service在很多情況下只是一個(gè)概念,而真正將Service的作用落實(shí)的是背后的kube-proxy服務(wù)進(jìn)程。在Kubernetes集群的每個(gè)Node上都會(huì)運(yùn)行一個(gè)kube-proxy服務(wù)進(jìn)程,這個(gè)進(jìn)程可以看作Service的透明代理兼負(fù)載均衡器,其核心功能是將到某個(gè)Service的訪問請(qǐng)求轉(zhuǎn)發(fā)到后端的多個(gè)Pod實(shí)例上。對(duì)每一個(gè)TCP類型的KubernetesService,kube-proxy都會(huì)在本地Node上建立一個(gè)SocketServer來負(fù)責(zé)接收請(qǐng)求,然后均勻發(fā)送到后端某個(gè)Pod的端口上,這個(gè)過程默認(rèn)采用RoundRobin負(fù)載均衡算法。Kube-proxy和后端Pod的通信方式與標(biāo)準(zhǔn)的Pod到Pod的通信方式完全相同。另外,Kubernetes也提供通過修改Service的service.spec.sessionAffinity參數(shù)的值來實(shí)現(xiàn)會(huì)話保持特性的定向轉(zhuǎn)發(fā),如果設(shè)置的值為“ClientIP”,則將來自同一個(gè)ClientIP的請(qǐng)求都轉(zhuǎn)發(fā)到同一個(gè)后端Pod上。此外,Service的ClusterIP與NodePort等概念是kube-proxy通過Iptables和NAT轉(zhuǎn)換實(shí)現(xiàn)的,kube-proxy在運(yùn)行過程中動(dòng)態(tài)創(chuàng)建與Service相關(guān)的Iptables規(guī)則,這些規(guī)則實(shí)現(xiàn)了ClusterIP及NodePort的請(qǐng)求流量重定向到kube-proxy進(jìn)程上對(duì)應(yīng)服務(wù)的代理端口的功能。由于Iptables機(jī)制針對(duì)的是本地的kube-proxy端口,所以如果Pod需要訪問Service,則它所在的那個(gè)Node上必須運(yùn)行kube-proxy,并且在每個(gè)Kubernetes的Node上都會(huì)運(yùn)行kube-proxy組件。在Kubernetes集群內(nèi)部,對(duì)ServiceClusterIP和Port的訪問可以在任意Node上進(jìn)行,這個(gè)因?yàn)槊總€(gè)Node上的kube-proxy針對(duì)該Service都設(shè)置了相同的轉(zhuǎn)發(fā)規(guī)則。綜上所述,由于kube-proxy的作用,在Service的調(diào)用過程中客戶端無需關(guān)心后端有幾個(gè)Pod,中間過程的通信、負(fù)載均衡及故障恢復(fù)都是透明的,如下圖所示。圖7Service的負(fù)載均衡轉(zhuǎn)發(fā)訪問Service的請(qǐng)求,不論是用ClusterIP+TargetPort的方式,還是用節(jié)點(diǎn)機(jī)IP+NodePort的方式,都會(huì)被節(jié)點(diǎn)機(jī)的Iptables規(guī)則重定向到kube-proxy監(jiān)聽Service服務(wù)代理端口。Kube-proxy接收到Service的訪問請(qǐng)求后,會(huì)如何選擇后端Pod?首先,目前kube-proxy的負(fù)載均衡只支持RoundRobin算法。該算法按照成員列表逐個(gè)選取成員,如果一輪循環(huán)完,便從頭開始下一輪,如此循環(huán)往復(fù)。Kube-proxy的負(fù)載均衡器在RoundRobin算法的基礎(chǔ)上還支持Session保持。如果Service在定義中指定了Session保持,則kube-proxy接收請(qǐng)求時(shí)會(huì)從本地內(nèi)存中查找是否存在來自該請(qǐng)求IP的affinityState對(duì)象,如果存在該對(duì)象,且Session沒有超時(shí),則kube-proxy將請(qǐng)求轉(zhuǎn)向該affinityState所指向的后端Pod。如果本地存在沒有來自該請(qǐng)求IP的affinityState對(duì)象,記錄請(qǐng)求的IP和指向的Endpoint。后面的請(qǐng)求就會(huì)粘連到這個(gè)創(chuàng)建好的affinityState對(duì)象上,這就實(shí)現(xiàn)了客戶端IP會(huì)話保持的功能。接下來我們深入分析kube-proxy的實(shí)現(xiàn)細(xì)節(jié)。kube-proxy進(jìn)程為每個(gè)Service都建立了一個(gè)“服務(wù)代理對(duì)象”,服務(wù)代理對(duì)象是kube-proxy程序內(nèi)部的一種數(shù)據(jù)結(jié)構(gòu),它包括一個(gè)用于監(jiān)聽此服務(wù)請(qǐng)求的SocketServer,SocketServer的端口是隨機(jī)選擇的一個(gè)本地空閑端口。此外,kube-proxy內(nèi)部也建立了一個(gè)“負(fù)載均衡器組件”,用來實(shí)現(xiàn)SocketServer上收到的連接到后端多個(gè)Pod連接之間的負(fù)載均衡和會(huì)話保持能力。kube-proxy通過查詢和監(jiān)聽APIServer中Service與Endpoint的變化來實(shí)現(xiàn)其主要功能,包括為新創(chuàng)建的Service打開一個(gè)本地代理對(duì)象(代理對(duì)象是kube-proxy程序內(nèi)部的一種數(shù)據(jù)結(jié)構(gòu),一個(gè)Service端口是一個(gè)代理對(duì)象,包括一個(gè)用于監(jiān)聽的服務(wù)請(qǐng)求的SocketServer),接收請(qǐng)求,針對(duì)發(fā)生變化的Service列表,kube-proxy會(huì)逐個(gè)處理。下面是具體的處理流程:(1)如果該Service沒有設(shè)置集群IP(ClusterIP),則不做任何處理,否則,獲取該Service的所有端口定義列表(spec.ports域)(2)逐個(gè)讀取服務(wù)端口定義列表中的端口信息,根據(jù)端口名稱、Service名稱和Namespace判斷本地是否已經(jīng)存在對(duì)應(yīng)的服務(wù)代理對(duì)象,如果不存在就新建,如果存在且Service端口被修改過,則先刪除Iptables中和該Service相關(guān)的的規(guī)則,關(guān)閉服務(wù)代理對(duì)象,然后走新建流程,即為該Service端口分配服務(wù)代理對(duì)象并為該Service創(chuàng)建相關(guān)的Iptables規(guī)則。(3)更新負(fù)載均衡器組件中對(duì)應(yīng)Service的轉(zhuǎn)發(fā)地址表,對(duì)于新建的Service,確定轉(zhuǎn)發(fā)時(shí)的會(huì)話保持策略。(4)對(duì)于已經(jīng)刪除的Service則進(jìn)行清理。圖8Kube-proxy與APIServer的交互過程3.4外部到內(nèi)部的訪問Pod作為基本的資源對(duì)象,除了會(huì)被集群內(nèi)部的Pod訪問,也會(huì)被外部使用。服務(wù)是對(duì)一組功能相同Pod的抽象,以它為單位對(duì)外提供服務(wù)是最合適的粒度。由于Service對(duì)象在ClusterIPRange池中分配到的IP只能在內(nèi)部訪問,所以其他Pod都可以無障礙地訪問到它。但如果這個(gè)Service作為前端服務(wù),準(zhǔn)備為集群外的客戶端提供服務(wù),就需要外部能夠看到它。Kubernetes支持兩種對(duì)外服務(wù)的Service的Type定義:NodePort和LoadBalancer。(1)NodePort在定義Service時(shí)指定spec.type=NodePort,并指定spec.ports.nodePort的值,系統(tǒng)就會(huì)在Kubernetes集群中的每個(gè)Node上打開一個(gè)主機(jī)上的真實(shí)端口號(hào)。這樣,能夠訪問Node的客戶端就能通過這個(gè)端口號(hào)訪問到內(nèi)部的Service了。(2)LoadBalancer如果云服務(wù)商支持外接負(fù)載均衡器,則可以通過spec.type=LoadBalancer定義Service,同時(shí)需要指定負(fù)載均衡器的IP地址。使用這種類型需要指定Service的NodePort和ClusterIP。對(duì)于這個(gè)Service的訪問請(qǐng)求將會(huì)通過LoadBalancer轉(zhuǎn)發(fā)到后端Pod上去,負(fù)載分發(fā)的實(shí)現(xiàn)方式依賴于云服務(wù)商提供的LoadBalancer的實(shí)現(xiàn)機(jī)制。(3)外部訪問內(nèi)部Service原理我們從集群外部訪問集群內(nèi)部,最終都是落在具體的Pod上。通過NodePort的方式就是將kube-proxy開放出去,利用Iptables為服務(wù)的NodePort設(shè)置規(guī)則,將對(duì)Service的訪問轉(zhuǎn)到kube-proxy上,這樣kube-proxy就可以使用和內(nèi)部Pod訪問服務(wù)一樣的方式來訪問后端的一組Pod了。這種模式就是利用kube-proxy作為負(fù)載均衡器,處理外部到服務(wù)進(jìn)一步到Pod的訪問。而更常用的是外部均衡器模式。通常的實(shí)現(xiàn)是使用一個(gè)外部的負(fù)載均衡器,這些均衡器面向集群內(nèi)的所有節(jié)點(diǎn)。當(dāng)網(wǎng)絡(luò)流量發(fā)送到LoadBalancer地址時(shí),它會(huì)識(shí)別出這是某個(gè)服務(wù)的一部分,然后路由到合適的后端Pod。所以從外面訪問內(nèi)部的Pod資源,就有了很多種不同的組合。外面沒有負(fù)載均衡器,直接訪問內(nèi)部的Pod外面沒有負(fù)載均衡器,直接通過訪問內(nèi)部的負(fù)載均衡器來訪問Pod外面有負(fù)載均衡器,通過外部負(fù)載均衡器直接訪問內(nèi)部的Pod外面有負(fù)載均衡器,通過訪問內(nèi)部的負(fù)載均衡器來訪問內(nèi)部的Pod第一種情況的場(chǎng)景十分少見,只是在特殊的時(shí)候才需要。我們?cè)趯?shí)際的生產(chǎn)項(xiàng)目中需要逐一訪問啟動(dòng)的Pod,給它們發(fā)送一個(gè)刷新指令。只有這種情況下才使用這種方式。這需要開發(fā)額外的程序,讀取Service下的Endpoint列表,逐一和這些Pod進(jìn)行通信。通常要避免這種通信方式,例如可以采取每個(gè)Pod從集中的數(shù)據(jù)源拉命令的方式,而不是采取推命令給它的方式來避免。因?yàn)榫唧w到每個(gè)Pod的啟停本來就是動(dòng)態(tài)的,如果依賴了具體的Pod們就相當(dāng)于繞開了Kubernetes的Service機(jī)制,雖然能夠?qū)崿F(xiàn),但是不理想。第二種情況就是NodePort的方式,外部的應(yīng)用直接訪問Service的NodePort,并通過Kube-proxy這個(gè)負(fù)載均衡器訪問內(nèi)部的Pod。第三種情況是LoadBalancer模式,因?yàn)橥獠康腖oadBalancer是具備Kubernetes知識(shí)的負(fù)載均衡器,它會(huì)去監(jiān)聽Service的創(chuàng)建,從而知曉后端的Pod啟停變化,所以它有能力和后端的Pod進(jìn)行通信。但是這里有個(gè)問題需要注意,那就是這個(gè)負(fù)載均衡器需要有辦法直接和Pod進(jìn)行通信。也就是說要求這個(gè)外部的負(fù)載均衡器使用和Pod到Pod一樣的通信機(jī)制。第四種情況也很少使用,因?yàn)樾枰?jīng)歷兩級(jí)的負(fù)載均衡設(shè)備,而且網(wǎng)絡(luò)的調(diào)用被兩次隨機(jī)負(fù)載均衡后,更難跟蹤了。在實(shí)際生產(chǎn)環(huán)境中出了問題排錯(cuò)時(shí),很難跟蹤網(wǎng)絡(luò)數(shù)據(jù)的流動(dòng)過程。(4)外部硬件負(fù)載均衡器模式在很多實(shí)際的生產(chǎn)環(huán)境中,由于是在私有云環(huán)境中部署Kubernetes集群,所以傳統(tǒng)的負(fù)載均衡器都對(duì)Service無感知。實(shí)際上我們只需要解決兩個(gè)問題,就可以將它變成Service可感知的負(fù)載均衡器,這也是實(shí)際系統(tǒng)中理想的外部訪問Kubernetes集群內(nèi)部的模式。通過寫一個(gè)程序來監(jiān)聽Service的變化,將變化按照負(fù)載均衡器的通信接口,作為規(guī)則寫入負(fù)載均衡器。給負(fù)載均衡器提供直接訪問Pod的通信手段。如下圖,說明了這個(gè)過程。圖9自定義外部負(fù)載均衡器訪問Service這里提供了一個(gè)ServiceAgent來實(shí)現(xiàn)Service變化的感知。該Agent能夠直接從etcd中或者通過接口調(diào)用APIServer來監(jiān)控Service及Endpoint的變化,并將變化寫入外部的硬件負(fù)載均衡器中。同時(shí),每臺(tái)Node上都運(yùn)行著有路由發(fā)現(xiàn)協(xié)議的軟件,該軟件負(fù)責(zé)將這個(gè)Node上所有的地址通過路由發(fā)現(xiàn)協(xié)議組播給網(wǎng)絡(luò)內(nèi)的其他主機(jī),當(dāng)然也包含硬件負(fù)載均衡器。這樣硬件負(fù)載均衡器就能知道每個(gè)Pod實(shí)例的IP地址是在哪臺(tái)Node上了。通過上述兩個(gè)步驟,就建立起一個(gè)基于硬件的外部可感知Service的負(fù)載均衡器。3.5總結(jié)本章重點(diǎn)介紹了Kubernetes網(wǎng)絡(luò)的各種場(chǎng)景,包括容器之間、Pod之間、Pod到Service、外部到內(nèi)部的這4種場(chǎng)景下,不同的通信模式。在設(shè)計(jì)Kubernetes容器平臺(tái)的時(shí)候,建議按照這些通信模式,根據(jù)具體的場(chǎng)景,逐一比對(duì)選擇合適的解決方案。其中,需要注意的是外部到內(nèi)部的訪問,既可以通過NodePort,也可以通過LoadBalancer的方式亦或是Ingress模式,需要按照具體的場(chǎng)景來分析。NodePort服務(wù)是暴露服務(wù)的最原始方式,會(huì)在所有節(jié)點(diǎn)上打開特定的端口,并且發(fā)送到此端口的任何流量都將轉(zhuǎn)發(fā)到該服務(wù)。這種方法有很多缺點(diǎn):每個(gè)端口只能有一個(gè)服務(wù);默認(rèn)只能使用端口30000~32767;如果節(jié)點(diǎn)IP地址發(fā)生更改,則會(huì)帶來問題。由于這些原因,不建議在生產(chǎn)中使用這種方法。如果服務(wù)可用性不是特別關(guān)注,或者特別關(guān)注成本,則這個(gè)方案比較合適。LoadBalancer是服務(wù)暴露的標(biāo)準(zhǔn)方式,將會(huì)啟動(dòng)一個(gè)網(wǎng)絡(luò)負(fù)載均衡器,提供一個(gè)將所有流量轉(zhuǎn)發(fā)到服務(wù)的IP地址。如果直接暴露一個(gè)服務(wù),這是默認(rèn)的方法。指定的端口上所有的流量將被轉(zhuǎn)發(fā)到該服務(wù),沒有過濾、路由等。這就意味著可以發(fā)送幾乎任何類型流量,如HTTP、TCP、UDP、Websocket、gRPC或其他。這個(gè)方式最大的缺點(diǎn)是,使用LoadBalancer公開的每項(xiàng)服務(wù)都將獲得自己的IP地址,并且必須為每個(gè)服務(wù)使用一個(gè)LoadBalancer,這將會(huì)付出比較大的代價(jià)。Ingress實(shí)際上不是一種服務(wù)。相反,它位于多個(gè)服務(wù)之前,充當(dāng)集群中的“智能路由器”或入口點(diǎn)。默認(rèn)的Ingress控制器將會(huì)啟動(dòng)一個(gè)HTTP(s)負(fù)載均衡器。這將可以執(zhí)行基于路徑和基于子域名的路由到后端服務(wù)。Ingress可能是暴露服務(wù)最強(qiáng)大的方式了,但也可能是最復(fù)雜的。如果希望在相同的IP地址下暴露多個(gè)服務(wù),并且這些服務(wù)都使用相同的L7協(xié)議,則Ingress是最有用的。4Kubernetes網(wǎng)絡(luò)組件介紹4.1Kubernetes網(wǎng)絡(luò)框架CNI基于Docker的Kubernetes平臺(tái)為什么沒有選擇CNM作為其網(wǎng)絡(luò)設(shè)計(jì)框架?畢竟大部分容器平臺(tái)肯定會(huì)支持Docker的網(wǎng)絡(luò)組件,為什么不使用相同的組件呢?這就要從Kubernetes平臺(tái)設(shè)計(jì)初衷說起,Kubernetes是一個(gè)支持多容器的運(yùn)行環(huán)境,而Docker只是其中一個(gè)容器而已。Docker網(wǎng)絡(luò)驅(qū)動(dòng)設(shè)計(jì)中,做了很多和Kubernetes不兼容的假設(shè)。例如,Docker中有“本地”驅(qū)動(dòng)和“全局”驅(qū)動(dòng)概念,“本地”驅(qū)動(dòng)實(shí)現(xiàn)單機(jī)版,無法實(shí)現(xiàn)跨節(jié)點(diǎn)協(xié)作,“全局”驅(qū)動(dòng)libkv可實(shí)現(xiàn)跨節(jié)點(diǎn)協(xié)作。但是,libkv接口太過于底層,而且架構(gòu)模式也是Docker內(nèi)部的量身定制版本,對(duì)于Kubernetes的應(yīng)用會(huì)帶來性能、可擴(kuò)展性和安全性方面的問題。CNI(ContainerNetworkingInterface)提供了一種Linux的應(yīng)用容器的插件化網(wǎng)絡(luò)解決方案。最初是由rktNetworkingProposal發(fā)展而來。也就是說,CNI本身并不是完全針對(duì)Docker的容器,而是提供一種普適的容器網(wǎng)絡(luò)解決方案。模型涉及兩個(gè)概念:容器:擁有獨(dú)立Linux網(wǎng)絡(luò)命名空間的獨(dú)立單元。比如rkt/docker創(chuàng)建出來的容器。網(wǎng)絡(luò)(Networking):網(wǎng)絡(luò)指代了可以相互聯(lián)系的一組實(shí)體。這些實(shí)體擁有各自獨(dú)立唯一的IP。這些實(shí)體可以是容器,是物理機(jī),或者是其他網(wǎng)絡(luò)設(shè)備(比如路由器)等。CNI的接口設(shè)計(jì)非常簡(jiǎn)潔,不需要守護(hù)進(jìn)程,只有兩個(gè)接口ADD/DELETE,通過一個(gè)簡(jiǎn)單的shell腳本就可以完成。相對(duì)于CNM的復(fù)雜設(shè)計(jì),CNI更加適合快速開發(fā)和迭代。4.2CNI支持的開源組件4.2.1FlannelFlannel之所以可以搭建Kubernetes依賴的底層網(wǎng)絡(luò),是因?yàn)樗梢詫?shí)現(xiàn)以下兩點(diǎn):它給每個(gè)node上的docker容器分配相互不相沖突的IP地址;它能給這些IP地址之間建立一個(gè)覆蓋網(wǎng)絡(luò),通過覆蓋網(wǎng)絡(luò),將數(shù)據(jù)包原封不動(dòng)的傳遞到目標(biāo)容器內(nèi)。Flannel是CoreOS團(tuán)隊(duì)針對(duì)Kubernetes設(shè)計(jì)的一個(gè)網(wǎng)絡(luò)規(guī)劃服務(wù),簡(jiǎn)單來說,它的功能是讓集群中的不同節(jié)點(diǎn)主機(jī)創(chuàng)建的Docker容器都具有全集群唯一的虛擬IP地址。在默認(rèn)的Docker配置中,每個(gè)節(jié)點(diǎn)上的Docker服務(wù)會(huì)分別負(fù)責(zé)所在節(jié)點(diǎn)容器的IP分配。這樣導(dǎo)致的一個(gè)問題是,不同節(jié)點(diǎn)上容器可能獲得相同的內(nèi)外IP地址。并使這些容器之間能夠之間通過IP地址相互找到,也就是相互ping通。Flannel的設(shè)計(jì)目的就是為集群中的所有節(jié)點(diǎn)重新規(guī)劃IP地址的使用規(guī)則,從而使得不同節(jié)點(diǎn)上的容器能夠獲得“同屬一個(gè)內(nèi)網(wǎng)”且“不重復(fù)的”IP地址,并讓屬于不同節(jié)點(diǎn)上的容器能夠直接通過內(nèi)網(wǎng)IP通信。Flannel實(shí)質(zhì)上是一種“覆蓋網(wǎng)絡(luò)(OverlayNetwork)”,也就是將TCP數(shù)據(jù)包裝在另一種網(wǎng)絡(luò)包里面進(jìn)行路由轉(zhuǎn)發(fā)和通信,默認(rèn)的節(jié)點(diǎn)間數(shù)據(jù)通信方式是UDP轉(zhuǎn)發(fā)。圖10Flannel跨節(jié)點(diǎn)Pod通信圖舉個(gè)例子,上圖是跨節(jié)點(diǎn)Pod通信。可以看到,F(xiàn)lannel首先創(chuàng)建了一個(gè)名為flannel0的網(wǎng)橋,而且這個(gè)網(wǎng)橋的一端連接Docker0網(wǎng)橋,另一端連接一個(gè)叫做flanneld的服務(wù)進(jìn)程。flanneld進(jìn)程并不簡(jiǎn)單,它上連etcd,利用etcd來管理可分配的IP地址段資源,同時(shí)監(jiān)控etcd中每個(gè)Pod的實(shí)際地址,并在內(nèi)存中建立了一個(gè)Pod節(jié)點(diǎn)路由表;它下連Docker0和物理網(wǎng)絡(luò),使用內(nèi)存中的Pod節(jié)點(diǎn)路由表,將Docker0發(fā)給它的數(shù)據(jù)包包裝起來,利用物理網(wǎng)絡(luò)的連接將數(shù)據(jù)包投遞到目標(biāo)flanneld上,從而完成Pod到Pod之間的直接地址通信。4.2.2OVSOpenvSwitch是一個(gè)開源的虛擬交換機(jī)軟件,有點(diǎn)像Linux中的bridge,但是功能要復(fù)雜的多。OpenvSwitch的網(wǎng)橋可以直接建立多種通信通道(隧道)。這些通道的建立可以很容易地通過OVS的配置命令實(shí)現(xiàn)。在Kubernetes、Docker場(chǎng)景下,主要是建立L3到L3點(diǎn)隧道。如下圖所示。圖11OVSwithGRE原理圖首先,為了避免Docker創(chuàng)建的Docker0地址產(chǎn)生沖突(因?yàn)镈ockerDaemon啟動(dòng)且給Docker0選擇子網(wǎng)地址時(shí)只有幾個(gè)備選列表,很容易產(chǎn)生沖突),我們可以將Docker0網(wǎng)橋刪除,手動(dòng)建立一個(gè)Linux網(wǎng)橋,然后手動(dòng)給這個(gè)網(wǎng)橋配置IP地址范圍。其次,建立OpenvSwitch的網(wǎng)橋OVS,使用ovs-vsctl命令給OVS網(wǎng)橋增加GRE端口,在添加GRE端口時(shí)要將目標(biāo)連接的NodeIP地址設(shè)置為對(duì)端的IP地址。對(duì)每一個(gè)對(duì)端IP地址都需要這么操作(對(duì)于大型集群網(wǎng)絡(luò),這可是個(gè)體力活,要做自動(dòng)化腳本來完成)。最后,將OVS的網(wǎng)橋作為網(wǎng)絡(luò)接口,加入Docker的網(wǎng)橋上(Docker0或者自己手工建立的新網(wǎng)橋)。重啟OVS網(wǎng)橋和Docker的網(wǎng)橋,并添加一個(gè)Docker的地址段到Docker網(wǎng)橋的路由規(guī)則項(xiàng),就可以將兩個(gè)容器的網(wǎng)絡(luò)連接起來了。OVS的優(yōu)勢(shì)是,作為開源虛擬交換機(jī)軟件,它相對(duì)比較成熟和穩(wěn)定,而且支持各類網(wǎng)絡(luò)隧道協(xié)議,經(jīng)過了OpenStack等項(xiàng)目的考驗(yàn)。另一方面,在前面介紹Flannel的時(shí)候可知Flannel除了支持建立Overlay網(wǎng)絡(luò),保證Pod到Pod的無縫通信,還和Kubernetes、Docker架構(gòu)體系結(jié)合緊密。Flannel能夠感知Kubernetes的Service,動(dòng)態(tài)維護(hù)自己的路由表,還通過etcd來協(xié)助Docker對(duì)整個(gè)Kubernetes集群中Docker0的子網(wǎng)地址分配。而我們?cè)谑褂肙
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑龍江省齊齊哈爾市2025屆中考適應(yīng)性考試生物試題含解析
- 江蘇省揚(yáng)州市田家炳實(shí)驗(yàn)中學(xué)2025屆十校聯(lián)考最后生物試題含解析
- 2024年09月2024中國(guó)建設(shè)銀行青海省分行校園招聘140人筆試歷年參考題庫(kù)附帶答案詳解
- 2024年08月浦發(fā)銀行北京順義支行招考筆試歷年參考題庫(kù)附帶答案詳解
- 2024年08月哈爾濱銀行大連分行誠(chéng)聘5名工作人員筆試歷年參考題庫(kù)附帶答案詳解
- 2024年08月中國(guó)工商銀行網(wǎng)絡(luò)金融部平臺(tái)金融發(fā)展中心社會(huì)招考筆試歷年參考題庫(kù)附帶答案詳解
- 河南師范大學(xué)《中國(guó)現(xiàn)代文學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年08月福建廣發(fā)銀行福州分行招考(828)筆試歷年參考題庫(kù)附帶答案詳解
- 2024年08月湖南長(zhǎng)沙銀行博士后招考招考筆試歷年參考題庫(kù)附帶答案詳解
- 2024年08月湖北湖北省人民銀行系統(tǒng)業(yè)務(wù)操作崗位聘用制員工招考筆試歷年參考題庫(kù)附帶答案詳解
- 北京市海淀區(qū)2024-2025學(xué)年高一上學(xué)期期末考試歷史試題(含答案)
- 常用口服藥品的正確使用方法
- 《心肺復(fù)蘇機(jī)救治院內(nèi)心搏驟?;颊咦o(hù)理專家共識(shí)》解讀
- 中華傳統(tǒng)文化之文學(xué)瑰寶學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2023年外交學(xué)院招聘筆試備考試題及答案解析
- 滿堂支架計(jì)算
- MA5680T開局配置
- 焊接工藝評(píng)定表格(共11頁(yè))
- (完整word版)澳大利亞簽證54表(家庭構(gòu)成)
- CFG樁施工記錄表范本
- 二、菲涅耳公式表示反射波、折射波與入射波的振幅和位相關(guān)
評(píng)論
0/150
提交評(píng)論