flannel--容器跨主機網絡通訊方案

相關概念:
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次的用戶態和內核態的數據拷貝

    84caa6dc3f9dcdf8b88b56bd2e22138d.png

  • 第一次:用戶態的容器進程發出的 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模式必需要求集羣宿主機之間是二層連通的

經過路由規則進行轉發示意圖:

    824da616633528ad503bcdaa57e67222.png

相關文章
相關標籤/搜索