什么是Flannel
Flannel是一种跨主机容器间的网络通信方案,本身只是一个框架,真正提供网络功能的是其具体的后端实现
Flannel的后端实现有哪几种?
Flannel TUN设备的作用是什么?
Flannel会在宿主机上创建一个flannel0设备,它是一个TUN设备,TUN设备工作在三层,用来在操作系统内核和应用程序之间传递IP包。
Flannel中的子网是?
要想找到另一个容器,我们必须先找到另一个容器的宿主机IP,这就依靠Flannel中的子网,子网与宿主机的关系均被保存在Etcd中。
$ etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/100.96.1.0-24
/coreos.com/network/subnets/100.96.2.0-24
/coreos.com/network/subnets/100.96.3.0-24
$ etcdctl get/coreos.com/network/subnets/100.96.2.0-24
{"PublicIP":"10.168.0.3"}
Flannel UDP网络通信过程分析
$ 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
Flannel UDP模式下的通信图如下:
Flannel UDP模式的缺点
Flannel UDP模式最大的缺点是在发包过程中存在3次内核态和用户态的数据拷贝,上下文的切换和数据的拷贝代价都是极高的,如下图:
到达目的主机后的解封装是逆向过程。
由于UDP模式存在极大的性能损耗,这种模式已基本被废弃,取而代之的是VXLAN,VXLAN可以模式可以完全在内核态进行上述的封包和解封工作。