Docker 跨主機網絡方案分析


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

上篇文章介紹了容器網絡的單主機網絡,本文將進一步介紹多主機網絡,也就是跨主機的網絡。總結下來,多主機網絡解決方案包括但不限於以下幾種:overlay、macvlan、flannel、weave、cacico 等,下面將分別一一介紹這幾種網絡,

PS:本文僅從原理上對幾種網絡進行簡單的對比總結,不涉及太多的細節。

overlay

俗稱隧道網絡,它是基於 VxLAN 協議來將二層數據包封裝到 UDP 中進行傳輸的,目的是擴展二層網段,因為 VLAN 使用 12bit 標記 VLAN ID,最多支持 4094 個 VLAN,這對於大型雲網絡會成為瓶頸,而 VxLAN ID 使用 24bit 來標記,支持多達 16777216 個二層網段,所以 VxLAN 是擴展了 VLAN,也叫做大二層網絡。

overlay 網絡需要一個全局的“上帝”來記錄它網絡中的信息,比如主機地址,子網等,這個上帝在 Docker 中是由服務發現協議來完成的,服務發現本質上是一個 key-value 數據庫,要使用它,首先需要向它告知(注冊)一些必要的信息(如網絡中需要通信的主機),然后它就會自動去收集、同步網絡的信息,同時,還會維護一個 IP 地址池,分配給主機中的容器使用。Docker 中比較有名的服務發現有 Consul、Etcd 和 ZooKeeper。overlay 網絡常用 Consul。

創建 overlay 網絡會創建一個 Linux bridge br0,br0 會創建兩個接口,一個 veth2 作為與容器的虛擬網卡相連的 veth pair,另一個 vxlan1 負責與其他 host 建立 VxLAN 隧道,跨主機的容器就通過這個隧道來進行通信。

為了保證 overlay 網絡中的容器與外網互通,Docker 會創建另一個 Linux bridge docker_gwbridge,同樣,該 bridge 也存在一對 veth pair,要與外圍通信的容器可以通過這對 veth pair 到達 docker_gwbridge,進而通過主機 NAT 訪問外網。

macvlan

macvlan 就如它的名字一樣,是一種網卡虛擬化技術,它能夠將一個物理網卡虛擬出多個接口,每個接口都可以配置 MAC 地址,同樣每個接口也可以配自己的 IP,每個接口就像交換機的端口一樣,可以為它划分 VLAN。

macvlan 的做法其實就是將這些虛擬出來的接口與 Docker 容器直連來達到通信的目的。一個 macvlan 網絡對應一個接口,不同的 macvlan 網絡分配不同的子網,因此,相同的 macvlan 之間可以互相通信,不同的 macvlan 網絡之間在二層上不能通信,需要借助三層的路由器才能完成通信,如下,顯示的就是兩個不同的 macvlan 網絡之間的通信流程。

我們用一個 Linux 主機,通過配置其路由表和 iptables,將其配成一個路由器(當然是虛擬的),就可以完成不同 macvlan 網絡之間的數據交換,當然用物理路由器也是沒毛病的。

flannel

flannel 網絡也需要借助一個全局的上帝來同步網絡信息,一般使用的是 etcd。

flannel 網絡不會創建新的 bridge,而是用默認的 docker0,但創建 flannel 網絡會在主機上創建一個虛擬網卡,掛在 docker0 上,用於跨主機通信。

組件方式讓 flannel 多了幾分靈活性,它可以使用二層的 VxLAN 隧道來封裝數據包完成跨主機通信,也可以使用純三層的方案來通信,比如 host-gw,只需修改一個配置文件就可以完成轉化。

weave

weave 網絡沒有借助服務發現協議,也沒有 macvlan 那樣的虛擬化技術,只需要在不同主機上啟動 weave 組件就可以完成通信。

創建 weave 網絡會創建兩個網橋,一個是 Linux bridge weave,一個是 datapath,也就是 OVS,weave 負責將容器加入 weave 網絡中,OVS 負責將跨主機通信的數據包封裝成 VxLAN 包進行隧道傳輸。

calico

calico 是一個純三層的網絡,它沒有創建任何的網橋,它之所以能完成跨主機的通信,是因為它記住 etcd 將網絡中各網段的路由信息寫進了主機中,然后創建的一對的 veth pair,一塊留在容器的 network namespace 中,一塊成了主機中的虛擬網卡,加入到主機路由表中,從而打通不同主機中的容器通信。

calico 相較其他幾個網絡方案最大優點是它提供 policy 機制,用戶可以根據自己的需求自定義 policy,一個 policy 可能對應一條 ACL,用於控制進出容器的數據包,比如我們建立了多個 calico 網絡,想控制其中幾個網絡可以互通,其余不能互通,就可以修改 policy 的配置文件來滿足要求,這種方式大大增加了網絡連通和隔離的靈活性。

總結

1、除了以上的幾種方案,跨主機容器網絡方案還有很多,比如:Romana,Contiv 等,本文就不作過多展開了,大家感興趣可以查閱相關資料了解。

2、跨主機的容器網絡通常要為不同主機的容器維護一個 IP 池,所以大多方案需要借助第三方的服務發現方案。

3、跨主機容器網絡按傳輸方式可以分為純二層網絡,隧道網絡(大二層網絡),以及純三層網絡。


我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM