相關概念:
node
#udp工做模式用到的docker
TUN設備:是一種工做在三層(網絡層)的虛擬網絡設備;主要做用是,在內核和應用程序間傳遞IP包;數據庫
flannel0:是由flanneld建立的TUN設備;bash
#vxlan工做模式用到的網絡
VTEP設備:它是在二層進行封裝和解封裝操做ide
flannel.1:是由flanneld建立的VTEP設備,.1(VNI)的做用是讓VTEP設備識別數據幀是否是由本身處理的標識優化
#flannel進程spa
subnet:子網(flannel會爲每一個節點分配一個子網,保存在etcd中)orm
flanneld:負責子網的路由信息,在每臺node上生成路由信息blog
flannel的工做模式:overlay(疊加)網絡
1.UDP(最先出現的工做模式,效率最低的一種)
2.VxLAN(Virtual Extensible LAN,虛擬可擴展局域網,Linux內核自己支持的網絡虛擬化技術)
3.host-gw(效率最高,不能跨網段)
flannel工做示例:如下2個container須要跨主機通訊
Node1的容器container-1的IP:100.96.1.2
Node2的容器container-2的IP:100.96.2.3
UDP工做模式:須要在用戶態和內核態之間切換
查看node1上的路由;
# 在 Node 1 上 $ ip route default via 10.168.0.1 dev eth0 100.96.0.0/16 dev flannel0 proto kernel scope link src 100.96.1.0 100.96.1.0/24 dev docker0 proto kernel scope link src 100.96.1.1 10.168.0.0/24 dev eth0 proto kernel scope link src 10.168.0.2
能夠看到container-1須要訪問container-2時,須要經過第一條路由規則(經過flannel0),而後交給flanneld處理;
數據包在通過flanneld處理完成以後,交由第三條路由規則(經過eth0)發出;
數據包走向過程:能夠看到有3次的用戶態和內核態的數據拷貝
第一次:用戶態的容器進程發出的 IP 包通過 docker0 網橋進入內核態;
第二次:IP 包根據路由表進入 TUN(flannel0)設備,從而回到用戶態的 flanneld 進程;
第三次:flanneld 進行 UDP 封包以後從新進入內核態,將 UDP 包經過宿主機的 eth0 發出去。
注:因爲屢次發生了用戶態到內核態的切換,這是形成效率低的緣由,也是優化的重點;
VxLAN工做模式:直接在內核態完成數據包的封裝
在vxlan模式下,會建立一個名字爲flannel.1的VTEP設備;
此設備的做用是在內核中將收到的IP包進行封裝,發送給目的VTEP設備;
問:要發送給目的VTEP設備就須要知道目的VTEP設備的MAC地址,如何知道呢?
答:在新node啓動flanneld時,會自動在已有的node上記錄新node的flannel.1網段和MAC地址(經過ip neigh查看)
flannel.1知道了目的VTEP設備的IP段和MAC地址,就能夠在內核態進行封包工做了;
[root@node03 ~]# ip neigh show dev flannel.1 172.20.0.0 lladdr 9e:24:d0:e5:55:04 PERMANENT 172.20.3.0 lladdr 02:12:d3:96:d3:a1 PERMANENT 172.20.1.0 lladdr 3a:cb:a3:a0:48:29 PERMANENT 172.20.2.0 lladdr 26:3b:4e:6e:7c:69 PERMANENT
問:知道了目的VTEP設備的MAC後,數據包最終要發給哪臺物理機呢?
答:flannel.1轉發的依據,來自於一個叫做FDB的轉發數據庫(由flanneld進程維護),能夠經過bridge fdb命令查看;
此轉換數據庫記錄了要訪問目標VTEP設備的MAC地址,所在真實機器的IP;
[root@node01 ~]# bridge fdb show dev flannel.1 a6:23:df:7c:e5:10 dst 192.168.10.107 self permanent 02:12:d3:96:d3:a1 dst 192.168.10.53 self permanent 9e:24:d0:e5:55:04 dst 192.168.10.103 self permanent 3a:cb:a3:a0:48:29 dst 192.168.10.104 self permanent
在目標node收到數據包解封后,根據VNI=1的值,來決定是否是由flannel.1進行處理(拆包操做),並最終交由docker0處理;
特別注意:docker0網橋的地址範圍必須是Flannel爲宿主機分配的子網的子網;這樣在經過flannel0或者flannel.1設備後,纔會交給docker0處理;
總結:
1.vxlan模式經過建立的flannel.1設備,在內核態完成數據封裝和解封,提升轉發效率;
2.新節點加入flannel網絡時,會在老的flannel節點增長到新節點的flannel.1設備的網段信息、mac地址信息、所在物理節點的ip(由flanneld進程維護)
3.經過知道路由信息、mac地址信息、物理ip(經過bridge fdb查看)後就能夠開始數據包的封裝操做;
host-gw工做模式:無須要封包、解包操做,效率最高
host-gw原理:其實就是將每一個flannel的子網的下一跳,設置成該子網對應的宿主機的IP地址(路由規則,route -n查看);
host-gw經過host-gw的方式,實現了將數據包經過路由規則直接轉發,而無須進行封包、解包;
host-gw的核心:在於IP包在封裝成幀發送出去的時候,會使用路由表的「下一跳」來設置目的MAC地址;因爲經過二層網絡到達目的宿主機;
因此:host-gw模式必需要求集羣宿主機之間是二層連通的;
經過路由規則進行轉發示意圖: