1. 程式人生 > 其它 >容器跨主機的網路

容器跨主機的網路

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、跨主機容器網路按傳輸方式可以分為純二層網路,隧道網路(大二層網路),以及純三層網路。