當(dāng)您將多臺(tái)服務(wù)器節(jié)點(diǎn)組成一個(gè)Docker集群時(shí),需要對集群網(wǎng)絡(luò)進(jìn)行設(shè)置混稽,否則默認(rèn)情況下审胚,無法跨主機(jī)容器互聯(lián),接下來我們首先分析一下原因洽洁。
跨主機(jī)容器互聯(lián)
下圖描述了一個(gè)簡單的集群網(wǎng)絡(luò)饿自,在該集群內(nèi)昭雌,有兩臺(tái)服務(wù)器甲和乙健田,每臺(tái)服務(wù)器上都有兩張網(wǎng)卡妓局,分別連接公網(wǎng)和私網(wǎng),兩臺(tái)服務(wù)器可以通過私網(wǎng)互聯(lián)局雄,在兩個(gè)服務(wù)器節(jié)點(diǎn)上分別安裝了Docker炬搭,并且運(yùn)行了A/B/C/D 4個(gè)容器。
每臺(tái)服務(wù)器節(jié)點(diǎn)上都有一個(gè)?docker0?網(wǎng)橋迎变,這是docker啟動(dòng)后初始化的虛擬設(shè)備衣形,每個(gè)容器都與docker0網(wǎng)橋連接谆吴,并且句狼,容器的IP由docker自動(dòng)分配。
但是這個(gè)默認(rèn)情況下的網(wǎng)絡(luò)設(shè)置不支持跨主機(jī)的容器互聯(lián),原因有兩方面昔馋。
一秘遏,跨主機(jī)訪問容器邦危,沒有有效路由
比如,容器A要訪問容器D希坚,請求的地址為?192.168.1.4?裁僧,但是主機(jī)甲并不知道該將這個(gè)IP發(fā)送到那個(gè)網(wǎng)絡(luò)設(shè)備上滩报,主機(jī)甲也不知道主機(jī)乙內(nèi)部有個(gè)容器D脓钾。
二可训,多個(gè)節(jié)點(diǎn)上的容器網(wǎng)段沖突
默認(rèn)情況下,docker啟動(dòng)后初始化?docker0?網(wǎng)橋時(shí)飞崖,會(huì)隨機(jī)分配一個(gè)IP段固歪,那么牢裳,如果不加以協(xié)調(diào)蒲讯,多個(gè)節(jié)點(diǎn)內(nèi)的容器網(wǎng)絡(luò)有可能會(huì)沖突灰署,比如上圖中兩個(gè)網(wǎng)絡(luò)都采用了?192.168.1.1/24?網(wǎng)段溉箕,在這種情況下约巷,就會(huì)導(dǎo)致容器IP沖突,比如 B 和 C踩麦。
那么谓谦,只需要解決這兩個(gè)問題反粥,我們就可以實(shí)現(xiàn)跨主機(jī)的容器互聯(lián)才顿。
脈沖云集群網(wǎng)絡(luò)設(shè)置
使用脈沖云可以非常輕易地完成集群網(wǎng)絡(luò)設(shè)置郑气。在增加集群時(shí)尾组,只需要將集群的網(wǎng)絡(luò)類型設(shè)置為Flannel即可。
Flannel 是一個(gè)專門用于容器網(wǎng)絡(luò)互聯(lián)的軟件,脈沖云會(huì)自動(dòng)地在您的服務(wù)器節(jié)點(diǎn)上部署Flannel實(shí)現(xiàn)容器互聯(lián)潮峦。
設(shè)置Flannel時(shí)歹叮,可以指定容器局域網(wǎng)段和子網(wǎng)掩碼咆耿,如上圖所示,如果選擇局域網(wǎng)段為?172.16.0.0/12?子網(wǎng)掩碼為?255.255.240.0?那么窄做,在整個(gè)集群網(wǎng)絡(luò)中椭盏,就可以分配256個(gè)子網(wǎng)掏颊,IP段分別為172.16.0.0/20艾帐、?172.16.16.0/20乌叶、?172.16.32.0/20?等等,每個(gè)子網(wǎng)中可以再分配?4096?個(gè)IP柒爸。每個(gè)節(jié)點(diǎn)的?docker0?網(wǎng)橋使用一個(gè)子網(wǎng)准浴,每個(gè)容器使用一個(gè)子網(wǎng)內(nèi)的IP,那么我們就可以組成下圖中所示網(wǎng)絡(luò)捎稚。
圖中乐横,主機(jī)甲的docker被分配到了?172.16.0.1/20?子網(wǎng),主機(jī)已的docker被分配到了172.16.16.1/20?子網(wǎng)今野,兩個(gè)子網(wǎng)都處在一個(gè)由Flannel管理的虛擬網(wǎng)絡(luò)?172.16.0.0/12?中葡公,圖中以虛線代表。
到此条霜,在Flannel的協(xié)調(diào)下催什,各個(gè)主機(jī)上的Docker子網(wǎng)IP就不會(huì)再?zèng)_突了蛆楞,另外矛纹,F(xiàn)lannel會(huì)維護(hù)容器網(wǎng)絡(luò)的路由規(guī)則孩等,容器A就可以通過172.16.16.3訪問容器D了权她,也就實(shí)現(xiàn)了跨主機(jī)容器互聯(lián)董济。
Flannel維護(hù)的容器網(wǎng)絡(luò)是一個(gè)虛擬網(wǎng)絡(luò),在圖中的虛線也是為了抽象理解,如果你對Flannel的實(shí)現(xiàn)方式感興趣,可以繼續(xù)查閱Flannel的官方文檔雌续。
一些說明
上文中為了簡化方便理解鸽心,網(wǎng)橋IP和子網(wǎng)IP段沒有分開說明,在上圖中,主機(jī)甲所分配的子網(wǎng)網(wǎng)段是?172.16.0.0/20?,網(wǎng)段中的第一個(gè)IP?172.16.0.1?,用作網(wǎng)橋設(shè)備的IP仗岖。
由于一個(gè)網(wǎng)段中第一個(gè)IP用作網(wǎng)橋設(shè)備IP讽膏,最后一個(gè)IP用作廣播IP,所以在一個(gè)子網(wǎng)中,理論上可以分配 4096 個(gè)IP,但是實(shí)際上只有 4094 個(gè)IP可用。
在設(shè)置脈沖云集群網(wǎng)絡(luò)時(shí),選擇的集群網(wǎng)段請勿與已經(jīng)存在的網(wǎng)絡(luò)沖突,比如目標(biāo)集群已經(jīng)存在了?10.0.0.0/8?網(wǎng)絡(luò),那么請選擇?172.16.0.0/12?或?192.168.0.0/16?作為容器網(wǎng)絡(luò)卓起。
組網(wǎng)IP
在上文Flannel網(wǎng)絡(luò)的示意圖中奕筐,有三個(gè)網(wǎng)絡(luò)渊胸,公網(wǎng)?0.0.0.0/0?萨咳,私網(wǎng)?10.0.0.0/8?和虛擬的容器網(wǎng)絡(luò)?172.16.0.0/12?培他,強(qiáng)調(diào)容器網(wǎng)絡(luò)是虛擬網(wǎng)絡(luò)?原因是,這個(gè)網(wǎng)絡(luò)上的數(shù)據(jù)必須以其他網(wǎng)絡(luò)為載體抗果,這個(gè)網(wǎng)絡(luò)是一個(gè)二級(jí)網(wǎng)絡(luò)涕刚。
比如,主機(jī)甲上的容器A給主機(jī)乙上的容器D發(fā)送數(shù)據(jù)译秦,數(shù)據(jù)會(huì)被路由到?docker0?網(wǎng)橋上,然后數(shù)據(jù)會(huì)被Flannel通過主機(jī)甲的真實(shí)網(wǎng)卡验夯,發(fā)送到主機(jī)乙的網(wǎng)卡上,主機(jī)乙上運(yùn)行的Flannel豁护,繼續(xù)將數(shù)據(jù)轉(zhuǎn)發(fā)到主機(jī)乙的docker0?網(wǎng)橋上,最后到達(dá)容器D做瞪。
那么如果主機(jī)有多張網(wǎng)卡,就像圖中那樣,有兩張網(wǎng)卡分別連接公網(wǎng)和私網(wǎng)蹂随,那么我們需要為Flannel指定一個(gè)網(wǎng)卡/IP用以發(fā)送數(shù)據(jù)十嘿,這個(gè)IP版姑,我們稱為?組網(wǎng)IP剥险。即告訴主機(jī)甲上運(yùn)行的Flannel,使用哪個(gè)網(wǎng)卡/IP 去尋找主機(jī)乙久脯。
使用脈沖云組建的集群牢硅,會(huì)默認(rèn)使用節(jié)點(diǎn)的公網(wǎng)IP作為組網(wǎng)IP瞧剖。那么拭嫁,多個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)通信會(huì)被發(fā)送到公網(wǎng)之上可免,除非是跨機(jī)房互聯(lián),一般情況下做粤,我們希望節(jié)點(diǎn)間通過內(nèi)網(wǎng)傳輸數(shù)據(jù)浇借,以提高性能,或降低費(fèi)用怕品。
將主機(jī)添加到集群后妇垢,在主機(jī)設(shè)置頁面,選擇組網(wǎng)IP即可指定各個(gè)主機(jī)節(jié)點(diǎn)分別使用的組網(wǎng)IP肉康。
NAT設(shè)備后的集群
NAT闯估,即網(wǎng)絡(luò)地址轉(zhuǎn)換,常用的路由器就是NAT設(shè)備吼和,在有NAT設(shè)備的網(wǎng)絡(luò)拓?fù)渲姓切剑钟蚓W(wǎng)內(nèi)的主機(jī)只有內(nèi)網(wǎng)IP,沒有公網(wǎng)IP炫乓,網(wǎng)絡(luò)如下所示:
在這種網(wǎng)絡(luò)模型下刚夺,各個(gè)服務(wù)器節(jié)點(diǎn)主機(jī)都通過路由器?8.8.8.8?連接脈沖云,所以脈沖云只能獲取到各個(gè)服務(wù)器的公網(wǎng)IP為?8.8.8.8?末捣,按上文所述侠姑,脈沖云會(huì)默認(rèn)使用公網(wǎng)IP?8.8.8.8?作為Flannel的組網(wǎng)IP,在這種情況下塔粒,會(huì)導(dǎo)致Flannel組網(wǎng)失敗结借,甚至Flannel會(huì)無法啟動(dòng)筐摘,因?yàn)橹鳈C(jī)上并不存在一個(gè)IP為?8.8.8.8?的網(wǎng)卡卒茬。
為解決這種問題,只需要手動(dòng)設(shè)置每一個(gè)節(jié)點(diǎn)的組網(wǎng)IP即可咖熟。
某些云服務(wù)商的主機(jī)也是在NAT設(shè)備之后的圃酵,比如阿里云服務(wù)器,如果使用了阿里云的VPC網(wǎng)絡(luò)馍管,即使給服務(wù)器綁定了公網(wǎng)IP?8.8.8.8郭赐,但是從主機(jī)上看,并沒有綁定公網(wǎng)IP的網(wǎng)卡設(shè)備确沸,只有一個(gè)內(nèi)網(wǎng)網(wǎng)卡捌锭,原因就是有NAT設(shè)備存在。這種情況下罗捎,也需要指定內(nèi)網(wǎng)IP為組網(wǎng)IP观谦。
文章轉(zhuǎn)載自:脈沖云平臺(tái)