1. 程式人生 > >趣談網路協議---容器網路之Flannel:每人一畝三分地

趣談網路協議---容器網路之Flannel:每人一畝三分地

Kubernetes,可靈活地將一個容器排程到任何一臺機器上,還可修改容器的副本數。

要解決的重要問題,是通訊。

1、應用將自己環境的 IP 和埠註冊到註冊中心指揮部,方便其他應用請求。如果發生變化,重新註冊。
在這裡插入圖片描述

2、應用如何相互通訊?通過 Flannel。

(1)不能每個物理機的網段都是 172.17.0.0/16,而是應該每臺物理機從這個大網段摳出一個小的網段,這樣,容器內的應用向註冊中心指揮部註冊容器 IP 時,就不會衝突了。

(2)物理機 A 上的容器如何訪問物理機 B 上的容器?Flannel 提供的 Overlay 方案主要兩種方式:

(a)使用者態方式,使用 TUN 裝置。
在這裡插入圖片描述

  • 物理機 A 上的容器 A 中,看到的容器 IP 是 172.17.8.2/24,預設路由規則:default via 172.17.8.1 dev eth0。
  • 容器A 要訪問 172.17.9.2,會發往預設閘道器 172.17.8.1,即物理機上 docker0 網橋的 IP。
  • 物理機檢視路由策略:172.17.9.0/24 via 172.17.9.0 dev flannel.1,即發往 172.17.9.2 的網路包會被轉發到 flannel.1 網絡卡。flannel.1 網絡卡是由 flanneld 程序開啟一個 /dev/net/tun 字元裝置時出現的。
  • flanneld 程序將發往 flannel.1 網絡卡的包讀入,封裝在 UDP 包中,然後在外層加上物理機 A 和物理機 B 的 IP,發給物理機 B 上的 flanneld。
  • 物理機 B 上的 flanneld 收到包,解開 UDP 包,將裡面的包拿出,從物理機 B 的 flanneld.1 網絡卡發出。
  • 包發給 docker0,docker 將包轉發給容器 B。

(b)核心態方式,使用 VXLAN。不需要開啟 TUN 裝置,而是建立 VXLAN 的 VTEP。
在這裡插入圖片描述

  • 通過 netlink 通知核心建立一個 VTEP 的網絡卡 flannel.1。netlink 是一種使用者態和核心態通訊的機制。
  • 容器 A 通過預設路由到達物理機 A 上的 docker0 網絡卡。
  • 在物理機 A 中,根據路由規則,將包轉發給 flannel.1。
  • flannel.1 是一個 VXLAN 的 VTEP,將網路包封裝。內部 MAC:flannel.1 的 MAC,外加 VXLAN 頭。外層 IP:物理機的 IP,外加物理機的 MAC。
  • 通過 VXLAN 將包轉發給另一臺機器,在物理機 B 上的 flannel.1 上解包。
  • 根據路由轉發到 docker0,最後轉發到容器 B。