當您將多臺服務器節點組成一個Docker集群時,需要對集群網絡進行設置,否則默認情況下,無法跨主機容器互聯,接下來我們首先分析一下原因。
跨主機容器互聯
下圖描述了一個簡單的集群網絡,在該集群內,有兩臺服務器甲和乙,每臺服務器上都有兩張網卡,分別連接公網和私網,兩臺服務器可以通過私網互聯,在兩個服務器節點上分別安裝了Docker,并且運行了A/B/C/D 4個容器。
每臺服務器節點上都有一個?docker0?網橋,這是docker啟動后初始化的虛擬設備,每個容器都與docker0網橋連接,并且,容器的IP由docker自動分配。
但是這個默認情況下的網絡設置不支持跨主機的容器互聯,原因有兩方面。
一,跨主機訪問容器,沒有有效路由
比如,容器A要訪問容器D,請求的地址為?192.168.1.4?,但是主機甲并不知道該將這個IP發送到那個網絡設備上,主機甲也不知道主機乙內部有個容器D。
二,多個節點上的容器網段沖突
默認情況下,docker啟動后初始化?docker0?網橋時,會隨機分配一個IP段,那么,如果不加以協調,多個節點內的容器網絡有可能會沖突,比如上圖中兩個網絡都采用了?192.168.1.1/24?網段,在這種情況下,就會導致容器IP沖突,比如 B 和 C。
那么,只需要解決這兩個問題,我們就可以實現跨主機的容器互聯。
脈沖云集群網絡設置
使用脈沖云可以非常輕易地完成集群網絡設置。在增加集群時,只需要將集群的網絡類型設置為Flannel即可。
Flannel 是一個專門用于容器網絡互聯的軟件,脈沖云會自動地在您的服務器節點上部署Flannel實現容器互聯。
設置Flannel時,可以指定容器局域網段和子網掩碼,如上圖所示,如果選擇局域網段為?172.16.0.0/12?子網掩碼為?255.255.240.0?那么,在整個集群網絡中,就可以分配256個子網,IP段分別為172.16.0.0/20、?172.16.16.0/20、?172.16.32.0/20?等等,每個子網中可以再分配?4096?個IP。每個節點的?docker0?網橋使用一個子網,每個容器使用一個子網內的IP,那么我們就可以組成下圖中所示網絡。
圖中,主機甲的docker被分配到了?172.16.0.1/20?子網,主機已的docker被分配到了172.16.16.1/20?子網,兩個子網都處在一個由Flannel管理的虛擬網絡?172.16.0.0/12?中,圖中以虛線代表。
到此,在Flannel的協調下,各個主機上的Docker子網IP就不會再沖突了,另外,Flannel會維護容器網絡的路由規則,容器A就可以通過172.16.16.3訪問容器D了,也就實現了跨主機容器互聯。
Flannel維護的容器網絡是一個虛擬網絡,在圖中的虛線也是為了抽象理解,如果你對Flannel的實現方式感興趣,可以繼續查閱Flannel的官方文檔。
一些說明
上文中為了簡化方便理解,網橋IP和子網IP段沒有分開說明,在上圖中,主機甲所分配的子網網段是?172.16.0.0/20?,網段中的第一個IP?172.16.0.1?,用作網橋設備的IP。
由于一個網段中第一個IP用作網橋設備IP,最后一個IP用作廣播IP,所以在一個子網中,理論上可以分配 4096 個IP,但是實際上只有 4094 個IP可用。
在設置脈沖云集群網絡時,選擇的集群網段請勿與已經存在的網絡沖突,比如目標集群已經存在了?10.0.0.0/8?網絡,那么請選擇?172.16.0.0/12?或?192.168.0.0/16?作為容器網絡。
組網IP
在上文Flannel網絡的示意圖中,有三個網絡,公網?0.0.0.0/0?,私網?10.0.0.0/8?和虛擬的容器網絡?172.16.0.0/12?,強調容器網絡是虛擬網絡?原因是,這個網絡上的數據必須以其他網絡為載體,這個網絡是一個二級網絡。
比如,主機甲上的容器A給主機乙上的容器D發送數據,數據會被路由到?docker0?網橋上,然后數據會被Flannel通過主機甲的真實網卡,發送到主機乙的網卡上,主機乙上運行的Flannel,繼續將數據轉發到主機乙的docker0?網橋上,最后到達容器D。
那么如果主機有多張網卡,就像圖中那樣,有兩張網卡分別連接公網和私網,那么我們需要為Flannel指定一個網卡/IP用以發送數據,這個IP,我們稱為?組網IP。即告訴主機甲上運行的Flannel,使用哪個網卡/IP 去尋找主機乙。
使用脈沖云組建的集群,會默認使用節點的公網IP作為組網IP。那么,多個節點之間的數據通信會被發送到公網之上,除非是跨機房互聯,一般情況下,我們希望節點間通過內網傳輸數據,以提高性能,或降低費用。
將主機添加到集群后,在主機設置頁面,選擇組網IP即可指定各個主機節點分別使用的組網IP。
NAT設備后的集群
NAT,即網絡地址轉換,常用的路由器就是NAT設備,在有NAT設備的網絡拓撲中,局域網內的主機只有內網IP,沒有公網IP,網絡如下所示:
在這種網絡模型下,各個服務器節點主機都通過路由器?8.8.8.8?連接脈沖云,所以脈沖云只能獲取到各個服務器的公網IP為?8.8.8.8?,按上文所述,脈沖云會默認使用公網IP?8.8.8.8?作為Flannel的組網IP,在這種情況下,會導致Flannel組網失敗,甚至Flannel會無法啟動,因為主機上并不存在一個IP為?8.8.8.8?的網卡。
為解決這種問題,只需要手動設置每一個節點的組網IP即可。
某些云服務商的主機也是在NAT設備之后的,比如阿里云服務器,如果使用了阿里云的VPC網絡,即使給服務器綁定了公網IP?8.8.8.8,但是從主機上看,并沒有綁定公網IP的網卡設備,只有一個內網網卡,原因就是有NAT設備存在。這種情況下,也需要指定內網IP為組網IP。
文章轉載自:脈沖云平臺