相关概念:

#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次的用户态和内核态的数据拷贝

    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