Flannel 后端对比

All problems in computer science can be solved by another level of indirection.

本文简单对比一下 flannel 中不同后端实现之间的区别,并尝试找到其中的相似点。

假设数据包流向是:

UDP VxLAN Host-GW
数据包是否流过 flanneld
正向/反向「代理」 flannel0(flanneld) flannel.1(VTEP) -
数据包如何流向正向代理 (docker0 无法处理)通过宿主机上的路由规则(见注 1)流向 flannel0 设备(TUN) (docker0 无法处理)通过宿主机上的路由规则(见注 2)流向 flannel.1(VTEP) -
正向代理如何知道将数据包发往哪台主机上的反向代理 代理需要「全局视角」。通过用户态的 flanneld 查询 API Server 里的对应关系,得知目标主机的 IP 地址 代理不需要「全局视角」。通过查询存储在本机的 FDB(注 3),得知目标主机的 IP 地址 -
封包结构 包结构 包结构 包结构
是否存在额外的用户态与内核态间数据拷贝
是否需要额外的数据包头
其它 由于代理实现在应用层(指 flanneld),所以外部数据帧如何封装是自己可以控制的 由于代理实现在内核层(指 VTEP 设备),所以外部数据帧如何封装需要 flanneld 的配合(见注 3) 要求主机间二层可达(注 4)

注:

  1. 路由规则由主机 A 上的 flanneld 进程添加。
  2. 路由规则由主机 B 上的 flanneld 进程在启动时添加到主机 A 中。也就是说在 VxLAN 模式下,flanneld 进程启动后,会将「如何来到我这里」这个信息通过路由表项的形式写到其它主机。
  3. FDB 里保存了对应关系:目的 VTEP 的 MAC 地址<->目的主机的 IP 地址,由 flanneld 维护
  4. Host-GW 模式下,子网与宿主机 IP 的对应关系直接写入路由表项(10.244.1.0/24 via dev 10.168.0.3 eth0),这里的 10.168.0.3 必须是与自己同子网的主机,否则路由无法添加成功

Latest update:2022/06/03

© 2019 - 2024 · Thinking Cell · Theme Simpleness Powered by Hugo ·