其他分享
首页 > 其他分享> > flannel--容器跨主机网络通信方案

flannel--容器跨主机网络通信方案

作者:互联网

相关概念:

#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需要跨主机通信

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

  注:由于多次发生了用户态到内核态的切换,这是造成效率低的原因,也是优化的重点;

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查看)后就可以开始数据包的封装操作;

标签:网络通信,VTEP,flanneld,主机,flannel.1,内核,设备,路由,flannel
来源: https://blog.51cto.com/liuzhengwei521/2427495