简述
k8s常用的两大网络插件Flannel和Calico都支持隧道技术,其中Calico支持IPinIP和BGP两种模式,IPIP模式中用到了隧道技术。但是Flannel和Calico使用的隧道技术是有区别的,Flannel使用的是vxlan技术,这种封包技术是MACinUDP的方式,因此Vxlan报文比原始报文多出了50个字节(8个vxlan协议相关字节,8个UDP头部字节
20个IP头部和14个MAC头部字节),这降低了网络线路传输有效数据得的比例,特别是小包。而Calico的IPinIP的封装方法只是在原始报文上添加了新的IP Header只多了20个字节。因此同样是隧道模式但是Calico的IPIP比Flannel的vxlan的网络性能更好。
其实,flannal支持多种后端模式,推荐使用的有三种:VXLAN,host-gw(损耗较少,但因路由设置的原因只适合小型网络)和UDP(一般用于不支持vxlan的内核或者实验),另外还有实验后端例如AliVPC、Alloc等。这里仅介绍vxlanl模式。
flannel的vxlan模式
flannel网络架构
cni0是一个网桥,pod-veth-port on bridge cni0,跨节点通信通过路由到vtep设备flannel.1上,flannel.1给数据封包成vxlan报文,通过flannel.1设置的对外通信网卡(可指定,如果未指定的话是默认路由对应的网卡)把数据包发出去。vtep(VXLAN Tunnel EndPoint)是直接与终端连接的设备,负责原始以太报文的VXLAN封装和解封装.
其中flanneld的主要作用是:
- UDP封包解包,之所以用UDP是因为该协议头包含5-Tuple(五元组即srcIP、dstIP、srcPort、dstPort和protocol)可用于交换机通信时的面对多条等价路由的HASH计算等因此不能用IP包封装。TCP可有五元组但它是面向连接的有三次握手不利于快速通信,而vxlan报文的可靠性可以通过上层应用来保证。
- 节点上的路由表的动态更新
flannel网络通信实例
- 首先flannel插件管理的容器内部通过路由到达cni0(10.244.1.1/24,集群内每个cni0IP地址各不相同):
[root@cluster-master-2 ~]# kubectl