在前面的几篇文章里我们介绍了基于flannel的underlay网络和overlay网络,包括host-gw模式的underlay网络,基于vxlan的overlay网络,基于udp的overlay网络。这里我们做一下回顾总结和对比,相关文章可以参考如下:
flannel underlay网络flannel vxlan overlay网络setupflannel vxlan overlay网络flannel udp overlay网络setupflannel udp overlay网络对于flannel underlay网络:
数据包从源pod的network namespace到host network namespace的docker0 linux bridge上。在源pod的host里做路由选择,下一跳地址为目标pod的host。在目标pod的host里做路由选择,本地直连路由到目标pod里。要求所有的worker node必须开启路由转发功能(net.ipv4.ip_forward = 1)。要求所有的worker node都在同一个二层网络里,来完成目标pod的下一跳路由。host里的路由会在flannel启动的时候写入,因为host连接etcd集群,知道哪个子网属于哪个host。对于flannel vxlan overlay网络:
每个宿主都有名字为flannel.x的vxlan网络设备来完成对于vxlan数据的udp封包与拆包,upd数据在宿主的8472端口上(端口值可配置)处理。数据从pod的network namespace进入到host的network namespace中。根据host network namespace中的路由表,下一跳ip为目标vxlan设备的ip,并且由当前host的flannel.x设备发送。根据host network namespace中的apr表找到下一跳ip的mac地址。根据host network namespace中fbd转发表找到下一跳ip的mac地址对应的转发ip。当前host的flannel.x设备根据下一跳ip的mac地址对应的转发ip和本地路由表进行upd封包,这个时候:外层udp包:源ip为当前host ip,目标ip为mac转发表中匹配的ip,源mac为前host ip的mac,目标mac为fdb中匹配ip的mac。目标端口为8472(可配置),vxlan id为1(可配置).内层二层以太包:源ip为源pod ip,目标ip为目标pod ip,源mac为源pod mac,目标mac为host network namespace中路由表里下一跳ip的mac(一般为目标pod对应的host中flannel.x设备ip的mac)。 数据包由当前host路由到目标节点host。目标节点host的8472端口接收到udp包之后,发现数据包里有vxlan id标识.。然后根据linux vxlan协议,在目标宿主机器上找到与数据报文中vxlan id对应的vxlan设备,将数据交由其处理。vxlan设备收到数据之后开始对vxlan udp报文拆包,去掉upd报文的ip,port,mac信息后得到内部的payload,发现是一个二层报文。然后继续对这个二层报文拆包,得到里面的源pod ip和目标pod ip。根据目标节点host上路由表,将数据由linux bridge docker0做本地转发。数据由linux bridge docker0利用veth pair转发到目标pod。每个host的flannel服务启动的时候读取etcd中的vxlan配置信息,在host的路由表的和mac转发接口表fdb里写入相应数据。对于flannel udp overlay网络:
每个宿主都有名字为flannel0的TUN网络设备来完成对于原始ip数据包的udp封包与拆包,upd数据在宿主的8285端口上(端口值可配置)的flannel进程处理。数据从pod的network namespace进入到host的network namespace中。根据host network namespace中的路由表,下一跳ip为目标为直连,并且由当前host的TUN设备flannel0发送。当前host的TUN设备flannel0将数据从内核空间交给用户空间应用程序flannel。户空间应用程序flannel根据目标ip属于哪个子网,然后在etcd中查询这个子网所在的目标host,最后完成upd封包,这个时候:对于原始ip包:源ip为源pod ip,目标ip为目标pod ip。对于外层udp包:源ip为当前host的ip,目标ip为flannel在etcd中查询的匹配ip,目标port为8285(可以配置),源端口为随机端口。flannel将upd包发送给TUN设备flannel0,数据由用户空间进入内核空间。数据在内核空间根据路由策略发送到目标宿主的8285端口。目标宿主的8285端口为flannel进程,数据由内核空间进入用户空间。flannel进程对udp数据拆包,去掉ip和port信息,得到内层的原始ip包。然后把这个包发送给TUN device flannel0,数据由程序用户空间进入内核空间。根据目标节点host上路由表,将数据由linux bridge docker0做本地转发。数据由linux bridge docker0利用veth pair转发到目标pod。对于以上三种方式:
都要求host宿主开启网络转发功能(net.ipv4.ip_forward = 1)。flannel underlay网络没有数据包的额外封包与拆包,效率会更高一些。对于flannel underlay网络要求所有的worker node都在同一个二层网络里,从而完成目标pod的下一跳路由。换句话说,underlay网络worker node不能跨子网。flannel vxlan overlay网络和flannel udp overlay网络的worker node只要三层路由可达就好,支持worker node能跨子网。对于flannel vxlan overlay网络和flannel udp overlay网络都有封包与拆包,并且外层包都是udp包。flannel vxlan overlay网络内层包是二层以太包,flannel udp overlay网络内层包是三层ip包。flannel vxlan overlay网络基于linux vxlan设备,flannel udp overlay网络基于linux TUN设备。flannel underlay网络和flannel vxlan overlay网络所有数据包都由操作系统内核空间处理,没有用户空间的应用程序参与。flannel udp overlay网络数据包既有操作系统内核空间处理,也有用户空间的应用程序flannel参与,所以udp overlay网络效率最低,基本不会在生产上使用。以上回顾了flannel underlay网络,vxlan overlay网络,udp overlay网络,做了一些总结和对比。但是在生产环境中具体选用那种网络请根据实际需求来,对于flannel underlay网络和flannel vxlan overlay网络并没有明显偏好。
---来自腾讯云社区的---TA码字
微信扫一扫打赏
支付宝扫一扫打赏