如何使用Flannel搭建跨主機互聯的容器網路

2021-09-13 09:40:11 字數 3330 閱讀 6801

當您將多台伺服器節點組成乙個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/20172.16.16.0/20172.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/12192.168.0.0/16作為容器網路。

在上文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

在這種網路模型下,各個伺服器節點主機都通過路由器8.8.8.8連線脈衝雲,所以脈衝雲只能獲取到各個伺服器的公網ip為8.8.8.8,按上文所述,脈衝雲會預設使用公網ip8.8.8.8作為flannel的組網ip,在這種情況下,會導致flannel組網失敗,甚至flannel會無法啟動,因為主機上並不存在乙個ip為8.8.8.8的網絡卡。

為解決這種問題,只需要手動設定每乙個節點的組網ip即可。

某些雲服務商的主機也是在nat裝置之後的,比如阿里雲伺服器,如果使用了阿里雲的vpc網路,即使給伺服器繫結了公網ip8.8.8.8,但是從主機上看,並沒有繫結公網ip的網絡卡裝置,只有乙個內網網絡卡,原因就是有nat裝置存在。這種情況下,也需要指定內網ip為組網ip。

如何用STUN協議搭建跨網路監控環境

stun實現原理 首先,公網的stun server必須具有雙網絡卡,用於資料交換。流 伺服器顯示作為客戶端,通過區域網ip向公網stun server傳送stun包,stun server接收到來自於區域網的流 伺服器傳送的包之後,就會給對傳送過來的埠傳送乙個反饋,若流 伺服器能收到這個反饋,則表...

如何使用Git實現跨SVN管理

如何使用git實現跨svn管理 created by xqz on 2014 12 31 問題 如何使用git實現跨svn管理 解決 一 所需軟體 tortoisesvn tortoisegit 1.8.11.0 64bit.msi git 1.9.4 preview20140815.exe 二 系...

如何使用UDP進行跨網段廣播

廣播域 首先我們來了解一下廣播域的概念。廣播域是網路中能接收任一台主機發出的廣播幀的所有主機集合。也就是說,如果廣播域內的其中一台主機發出乙個廣播幀,同一廣播域內所有的其它主機都可以收到該廣播幀。廣播域的計算 如何知道一台主機是屬於哪乙個廣播域呢?其實計算很簡單,只要用主機的ip位址與子網掩碼進行與...