由于host-gw使用通过远程计算机IP到子网的IP路由,因此它看起来像是纯L3网络解决方案。因此,为什么主机之间需要直接的L2连接?
7fhtutme1#
host-gw在主机上添加路由表条目,以便主机知道如何传输容器网络分组。这在L2上有效,因为它只涉及hosts、switches和containers。switches不关心IP和路由,hosts知道containers存在,以及如何路由到它们,containers只发送和接收数据。如果hosts位于不同的网络,则引入L3,并且涉及routers。routers不知道containers的存在,并且任何容器分组都将被丢弃,使得通信无法进行。当然,您可以在routers上添加路由表条目,但这超出了flannel的控制范围。
host-gw
hosts
switches
containers
routers
flannel
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,则数据包无法传送到节点(下一跳)
vlurs2pr3#
请考虑此实验示例,以了解host-gw基于L2连接的原因。子网192.168.20.0/24中的3节点群集正在运行flannel CNI插件,后端为host-gw。flannel按如下方式为每个节点分配一个网络:节点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的子网。现在每个节点都知道来自其他两个节点的范围(其他不相关的路由已被剥离):
192.168.20.0/24
192.168.20.200
10.42.0.0/24
192.168.20.201
10.42.1.0/24
192.168.20.202
10.42.2.0/24
10...
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地址node01。node01随后接收数据包并知道如何继续。所有这些都发生在L2上,不发生L3路由,也不涉及封装。
node02
10.42.0.20
node01
3条答案
按热度按时间7fhtutme1#
host-gw
在主机上添加路由表条目,以便主机知道如何传输容器网络分组。这在L2上有效,因为它只涉及
hosts
、switches
和containers
。switches
不关心IP和路由,hosts
知道containers
存在,以及如何路由到它们,containers
只发送和接收数据。如果
hosts
位于不同的网络,则引入L3,并且涉及routers
。routers
不知道containers
的存在,并且任何容器分组都将被丢弃,使得通信无法进行。当然,您可以在
routers
上添加路由表条目,但这超出了flannel
的控制范围。czfnxgou2#
host-gw在每台主机上添加路由表条目,条目如下:
最重要的一项是网关的值(10.110.110.21),路由表会将目的mac地址更改为L2直接连接到www.example.com(当前节点)的节点的mac_address(10.110.110.21)10.110.110.22。
如果未连接L2,则数据包无法传送到节点(下一跳)
vlurs2pr3#
请考虑此实验示例,以了解
host-gw
基于L2连接的原因。子网192.168.20.0/24
中的3节点群集正在运行flannel
CNI插件,后端为host-gw
。flannel
按如下方式为每个节点分配一个网络:节点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的子网。现在每个节点都知道来自其他两个节点的范围(其他不相关的路由已被剥离):当
node02
要将流量发送到IP为10.42.0.20
的Pod时,通过查询其路由表,它知道Pod的子网位于node01
上。发往Pod的流量的目标MAC将设置为MAC地址node01
。node01
随后接收数据包并知道如何继续。所有这些都发生在L2上,不发生L3路由,也不涉及封装。