kubernetes 为什么flannel的host-gw需要主机之间的直接第2层连接?

zqdjd7g9  于 2023-02-03  发布在  Kubernetes
关注(0)|答案(3)|浏览(154)

由于host-gw使用通过远程计算机IP到子网的IP路由,因此它看起来像是纯L3网络解决方案。
因此,为什么主机之间需要直接的L2连接?

7fhtutme

7fhtutme1#

host-gw在主机上添加路由表条目,以便主机知道如何传输容器网络分组。
这在L2上有效,因为它只涉及hostsswitchescontainersswitches不关心IP和路由,hosts知道containers存在,以及如何路由到它们,containers只发送和接收数据。
如果hosts位于不同的网络,则引入L3,并且涉及routersrouters不知道containers的存在,并且任何容器分组都将被丢弃,使得通信无法进行。
当然,您可以在routers上添加路由表条目,但这超出了flannel的控制范围。

czfnxgou

czfnxgou2#

host-gw在每台主机上添加路由表条目,条目如下:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.110.110.1    0.0.0.0         UG    100    0        0 eth0
10.100.14.0     10.110.110.21   255.255.255.0   UG    0      0        0 eth0
10.100.38.0     0.0.0.0         255.255.255.0   U     0      0        0 docker0
10.110.110.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
169.254.169.254 10.110.110.1    255.255.255.255 UGH   100    0        0 eth0

最重要的一项是网关的值(10.110.110.21),路由表会将目的mac地址更改为L2直接连接到www.example.com(当前节点)的节点的mac_address(10.110.110.21)10.110.110.22。
如果未连接L2,则数据包无法传送到节点(下一跳)

vlurs2pr

vlurs2pr3#

请考虑此实验示例,以了解host-gw基于L2连接的原因。子网192.168.20.0/24中的3节点群集正在运行flannel CNI插件,后端为host-gwflannel按如下方式为每个节点分配一个网络:
节点01 192.168.20.200获取10.42.0.0/24
节点02 192.168.20.201获取10.42.1.0/24
节点03 192.168.20.202获取10.42.2.0/24
每个10...范围都是Pod在相应节点上运行时将从中分配IP的子网。现在每个节点都知道来自其他两个节点的范围(其他不相关的路由已被剥离):

user@node01 ~ $ ip r
10.42.1.0/24 via 192.168.20.201 dev enp0s3  <= node02
10.42.2.0/24 via 192.168.20.202 dev enp0s3  <= node03
user@node02 ~ $ ip r
10.42.0.0/24 via 192.168.20.200 dev enp0s3  <= node01
10.42.2.0/24 via 192.168.20.202 dev enp0s3  <= node03
user@node03 ~ $ ip r
10.42.0.0/24 via 192.168.20.200 dev enp0s3  <= node01
10.42.1.0/24 via 192.168.20.201 dev enp0s3  <= node02

node02要将流量发送到IP为10.42.0.20的Pod时,通过查询其路由表,它知道Pod的子网位于node01上。发往Pod的流量的目标MAC将设置为MAC地址node01node01随后接收数据包并知道如何继续。所有这些都发生在L2上,不发生L3路由,也不涉及封装。

相关问题