相關概念:
#udp工作模式用到的
TUN設備:是一種工作在三層(網絡層)的虛擬網絡設備;主要作用是,在內核和應用程序間傳遞IP包;
flannel0:是由flanneld創建的TUN設備;
#vxlan工作模式用到的
VTEP設備:它是在二層進行封裝和解封裝操作
flannel.1:是由flanneld創建的VTEP設備,.1(VNI)的作用是讓VTEP設備識別數據幀是不是由自己處理的標識
#flannel進程
subnet:子網(flannel會爲每個節點分配一個子網,保存在etcd中)
flanneld:負責子網的路由信息,在每臺node上生成路由信息
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工作模式:直接在內核態完成數據包的封裝
注:當新node加入flannel網絡後,會在已有的node上增加一條路由(從已有node的VTEP設備到新加入node的VTEP設備的路由)
在vxlan模式下,會創建一個名字爲flannel.1的VTEP設備;
此設備的作用是在內核中將收到的IP包進行封裝,發送給目的VTEP設備;
問:要發送給目的VTEP設備就需要知道目的VTEP設備的MAC地址,如何知道呢?
答:在新node上,當flanneld啓動時,會自動通過ARP在已有的node上記錄新node的flannel.1的MAC地址(通過ip neigh查看)
flannel.1知道了目的VTEP設備的路由和MAC地址,就可以在內核態進行封包工作了;
問:知道了目的VTEP設備的MAC後,數據包最終要發給哪臺物理機呢?
答:flannel.1轉發的依據,來自於一個叫作FDB的轉發數據庫(由flanneld進程維護),可以通過bridge fdb命令查看;
此轉換數據庫記錄了要訪問目標VTEP設備的MAC地址,需要轉發到的真實IP的機器;
在目標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模式必須要求集羣宿主機之間是二層連通的;
通過路由規則進行轉發示意圖: