前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s集群网络(14)-flannel underlay overlay 网络通讯对比

k8s集群网络(14)-flannel underlay overlay 网络通讯对比

作者头像
TA码字
发布2020-04-01 11:18:30
2.2K0
发布2020-04-01 11:18:30
举报
文章被收录于专栏:TA码字TA码字

在前面的几篇文章里我们介绍了基于flannel的underlay网络和overlay网络,包括host-gw模式的underlay网络,基于vxlan的overlay网络,基于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网络并没有明显偏好。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档