k8s集群网络(14)-flannel underlay overlay 网络通讯对比
- 2020 年 4 月 1 日
- 笔记
在前面的几篇文章里我们介绍了基于flannel的underlay网络和overlay网络,包括host-gw模式的underlay网络,基于vxlan的overlay网络,基于udp的overlay网络。这里我们做一下回顾总结和对比,相关文章可以参考如下:
- flannel underlay网络
- flannel vxlan overlay网络setup
- flannel vxlan overlay网络
- flannel udp overlay网络setup
- flannel 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网络并没有明显偏好。