Flannel 后端对比
All problems in computer science can be solved by another level of indirection.
本文简单对比一下 flannel 中不同后端实现之间的区别,并尝试找到其中的相似点。
假设数据包流向是:
- 主机 A(10.168.0.2) -> 主机 B(10.168.0.3)
- 容器 10.244.0.2 -> 容器 10.244.1.3
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) |
注:
- 路由规则由主机 A 上的 flanneld 进程添加。
- 路由规则由主机 B 上的 flanneld 进程在启动时添加到主机 A 中。也就是说在 VxLAN 模式下,flanneld 进程启动后,会将「如何来到我这里」这个信息通过路由表项的形式写到其它主机。
- FDB 里保存了对应关系:目的 VTEP 的 MAC 地址<->目的主机的 IP 地址,由 flanneld 维护
- Host-GW 模式下,子网与宿主机 IP 的对应关系直接写入路由表项(10.244.1.0/24 via dev 10.168.0.3 eth0),这里的 10.168.0.3 必须是与自己同子网的主机,否则路由无法添加成功
Latest update:2022/06/03