使用Flannel搭建跨主機互聯的容器網路
當您將多台伺服器節點組成一個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段沒有分開說明,在上圖中,主機甲所分配的子網網段是
· 由於一個網段中第一個IP用作網橋設備IP,最後一個IP用作廣播IP,所以在一個子網中,理論上可以分配 4096 個IP,但是實際上只有 4094 個IP可用。· 在設置脈衝雲集群網路時,選擇的集群網段請勿與已經存在的網路衝突,比如目標集群已經存在了172.16.0.0/20,網段中的第一個IP172.16.0.1,用作網橋設備的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。點擊了解更多轉載內容
推薦閱讀:
※理解投射性認同與容器
※小熊容器上文字教程了! 鉤針交流 手工交流區
※關於微服務和容器
※揭秘阿里 PouchContainer 如何實現容器原地升級
※[收藏]100個容器引擎項目,點亮你的容器集群技能樹
