趣談網路協議---容器網路之Flannel:每人一畝三分地
阿新 • • 發佈:2018-12-13
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。