UDP模式
UDP模式,是Flannel项目最早支持的一种方式,却也是性能最差的一种方式。这种模式提供的是一个三层的Overlay网络,即:它首先对发出端的IP包进行UDP封装,然后在接收端进行解封装拿到原始的IP包,进而把这个IP包转发给目标容器。工作原理如下图所示。
Node 1上的Pod 1请求Node2上的Pod 2时,流量的走向如下:
- Pod 1里的进程发起请求,发出IP包;
- IP包根据Pod 1里的veth设备对,进入到cni0网桥;
- 由于IP包的目的ip不在Node 1上,根据flannel在节点上创建出来的路由规则,进入到flannel0中;
- 此时flanneld进程会收到这个包,flanneld判断该包应该在哪台node上,然后将其封装在一个UDP包中;
- 最后通过Node 1上的网关,发送给Node2;
flannel0是一个TUN设备(Tunnel设备)。在Linux中,TUN设备是一种工作在三层(Network Layer)的虚拟网络设备。TUN设备的功能:在操作系统内核和用户应用程序之间传递IP包。
可以看到,这种模式性能差的原因在于,整个包的UDP封装过程是flanneld程序做的,也就是用户态,而这就带来了一次内核态向用户态的转换,以及一次用户态向内核态的转换。在上下文切换和用户态操作的代价其实是比较高的,而UDP模式因为封包拆包带来了额外的性能消耗。