Docker網絡-overlay網絡驅動架構

內置的Docker覆蓋網絡驅動程序從根本上簡化了多主機網絡中的許多挑戰。藉助疊加驅動程序,多主機網絡是Docker內部的一等公民,而無需外部配置或組件。 overlay使用Swarm分佈式控制平面在超大型集羣中提供集中管理,穩定性和安全性。

VXLAN數據平面

覆蓋驅動程序利用行業標準的VXLAN數據平面,該數據平面將容器網絡與基礎物理網絡(底層)分離。 Docker覆蓋網絡將容器流量封裝在VXLAN標頭中,該流量允許流量穿越物理第2層或第3層網絡。無論基礎物理拓撲如何,覆蓋層都使網絡分段變得動態且易於控制。使用標準的IETF VXLAN標頭可以促進使用標準工具來檢查和分析網絡流量。

VXLAN(Virtual eXtensible Local Area Network)是一種隧道技術,能在三層網絡的基礎上建立二層以太網網絡隧道,從而實現跨地域的二層互連。VXLAN採取了將原始以太網報文封裝在UDP數據包裏的封裝格式。原來的二數據加上VXLAN頭部一起封裝一個UDP數據包裏。VXLAN部包含有一個VXLAN標識(即VNI,VXLAN Network Identifier),只有在同一個VXLAN的虛擬機之間才能相互通信VNI在數據包之中佔24比特,故可支持1600萬個VXLAN的同時存在,遠多VLAN的4094個,因此可大規模主機的部署

自3.7版以來,VXLAN便已成爲Linux內核的一部分,而Docker使用該內核的本機VXLAN功能來創建覆蓋網絡。 Docker覆蓋數據路徑完全位於內核空間中。這導致更少的上下文切換,更少的CPU開銷以及應用程序和物理NIC之間的低延遲,直接流量路徑。

 

 

 

在此圖中,我們看到了覆蓋網絡上的數據包流。當c1通過其共享覆蓋網絡發送c2數據包時,將執行以下步驟:

  1. c1爲c2執行DNS查找。由於兩個容器都在同一覆蓋網絡上,因此Docker Engine本地DNS服務器將c2解析爲其overlay網絡的IP地址10.0.0.3。
  2. 覆蓋網絡(overlay)是一個L2網段,因此c1會生成一個以c2的MAC地址爲目的地的L2幀。
  3. 覆蓋網絡驅動程序使用VXLAN標頭封裝了該幀。分佈式覆蓋控制平面管理每個VXLAN隧道端點的位置和狀態,因此它知道c2駐留在主機B上的物理地址192.168.1.3。該地址成爲底層IP標頭的目標地址。
  4. 封裝後,將發送數據包。物理網絡負責將VXLAN數據包路由或橋接到正確的主機。
  5. 數據包到達主機B的eth0接口,並由覆蓋網絡驅動程序解封裝。來自c1的原始L2幀傳遞到c2的eth0接口,然後傳遞到監聽應用程序。

 內部體系結構

Docker Swarm控制平面可自動執行覆蓋網絡的所有配置。 不需要VXLAN配置或Linux網絡配置。 數據平面加密(覆蓋層的可選功能)在創建網絡時也由覆蓋層驅動程序自動配置。 用戶或網絡運營商只需定義網絡(docker network create -d overlay ...)並將容器連接到該網絡。

 

在創建覆蓋網絡時,Docker Engine創建每個主機上覆蓋所需的網絡基礎結構。 將爲每個覆蓋網絡及其關聯的VXLAN接口創建一個Linux網橋。 僅當有容器連接到該網絡時,Docker引擎纔會實例化主機上的覆蓋網絡。 這樣可以防止不存在連接的覆蓋網絡蔓延。

在下面的示例中,我們創建一個覆蓋網絡並將容器連接到該網絡。 然後,我們將看到Docker Swarm / UCP自動創建了覆蓋網絡。

#Create an overlay named "ovnet" with the overlay driver
$ docker network create -d overlay ovnet


#Create a service from an nginx image and connect it to the "ovnet" overlay network
$ docker service create --network ovnet --name container nginx

創建覆蓋網絡後,在主機內部創建了多個接口和網橋。eth1是橋接網絡,eth2是overlay網絡

# Run the "ifconfig" command inside the nginx container
$ docker exec -it container ifconfig


#docker_gwbridge network
eth1      Link encap:Ethernet  HWaddr 02:42:AC:12:00:04
          inet addr:172.18.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe12:4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1


#overlay network
eth2      Link encap:Ethernet  HWaddr 02:42:0A:00:00:07
          inet addr:10.0.0.7  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:aff:fe00:7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
     
#container loopback
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:

 

已在容器內創建了兩個接口eth0,eth1,它們對應於主機上存在的eth2 overlay和eth1 docker_gwbridge。 在覆蓋網絡(overlay)上,每個容器將至少有兩個接口將其連接到overlay和docker_gwbridge

集羣網絡概念

Overlay networks

管理 Swarm 中 Docker 守護進程間的通信。你可以將服務附加到一個或多個已存在的 overlay 網絡上,使得服務與服務之間能夠通信。

ingress network

是一個特殊的 overlay 網絡,用於服務節點間的負載均衡。它將覆蓋範圍擴展到參與此特定覆蓋範圍的所有主機,也就說所有的swarm集羣共享一個overlay網絡。

當任何 Swarm 節點在發佈的端口上接收到請求時,它將該請求交給一個名爲 IPVS 的模塊。IPVS 跟蹤參與該服務的所有IP地址,選擇其中的一個,並通過 ingress 網絡將請求路由到它。
初始化或加入 Swarm 集羣時會自動創建 ingress 網絡,大多數情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。

docker_gwbridge

是一種橋接網絡,羣集流量的出口網橋。 每個主機僅存在一個docker_gwbridge。 容器到容器的通信在此網橋上被阻止,僅允許ingress/egress 通信流。將 overlay 網絡(包括 ingress 網絡)連接到一個單獨的 Docker 守護進程的物理網絡。默認情況下,服務正在運行的每個容器都連接到本地 Docker 守護進程主機的 docker_gwbridge 網絡。docker_gwbridge 網絡在初始化或加入 Swarm 時自動創建。

 

 

 

通信流程

在本例中,將 node1 上的容器稱爲 C1,node2 上的容器稱爲 C2,如下圖所示。假設 C1 希望 ping 通 C2,類似前面章節中的示例。

 

 

C1 發起 ping 請求,目標 IP 爲 C2 的地址 10.0.0.4。該請求的流量通過連接到 Br0 虛擬交換機 veth 接口發出。虛擬交換機並不知道將包發送到哪裏,因爲在虛擬交換機的 MAC 地址映射表(ARP 映射表)中並沒有與當前目的 IP 對應的 MAC 地址。

所以虛擬交換機會將該包發送到其上的全部端口。連接到 Br0 的 VTEP 接口知道如何轉發這個數據幀,所以會將自己的 MAC 地址返回。這就是一個代理 ARP 響應,並且虛擬交換機 Br0 根據返回結果學會了如何轉發該包。接下來虛擬交換機會更新自己的 ARP 映射表,將 10.0.0.4 映射到本地 VTEP 的 MAC 地址上。

現在 Br0 交換機已經學會如何轉發目標爲 C2 的流量,接下來所有發送到 C2 的包都會被直接轉發到 VTEP 接口。VTEP 接口知道 C2,是因爲所有新啓動的容器都會將自己的網絡詳情采用網絡內置 Gossip 協議發送給相同 Swarm 集羣內的其他節點。

交換機會將包轉發到 VTEP 接口,VTEP 完成數據幀的封裝,這樣就能在底層網絡傳輸。具體來說,封裝操作就是把 VXLAN Header 信息添加以太幀當中。

VXLAN Header 信息包含了 VXLAN 網絡 ID(VNID),其作用是記錄 VLAN 到 VXLAN 的映射關係。每個 VLAN 都對應一個 VNID,以便包可以在解析後被轉發到正確的 VLAN。

封裝的時候會將數據幀放到 UDP 包中,並設置 UDP 的目的 IP 字段爲 node2 節點的 VTEP 的 IP 地址,同時設置 UDP Socket 端口爲 4789。這種封裝方式保證了底層網絡即使不知道任何關於 VXLAN 的信息,也可以完成數據傳輸。

當包到達 node2 之後,內核發現目的端口爲 UDP 端口 4789,同時還知道存在 VTEP 接口綁定到該 Socket。所以內核將包發給 VTEP,由 VTEP 讀取 VNID,解壓包信息,並根據 VNID 發送到本地名爲 Br0 的連接到 VLAN 的交換機。在該交換機上,包被髮送給容器 C2。

以上大體介紹了 Docker 覆蓋網絡是如何利用 VXLAN 技術的。

最後一件需要注意的是,Docker 支持使用同樣的覆蓋網絡實現三層路由。例如,讀者可以創建包含兩個子網的覆蓋網絡,Docker 會負責子網間的路由。創建的命令如 docker network create --subnet=10.1.1.0/24 --subnet=11.1.1.0/24 -d overlay prod-net。該命令會在 Sandbox 中創建兩個虛擬交換機,默認支持路由。

參考文檔:http://c.biancheng.net/view/3198.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章