host-gw模式通信十分简单,它是通过 ip 路由直连的方式进行通信,flanneld 负责为各节点设置路由 ,将对应节点Pod子网的下一跳地址指向对应的节点的 ip :
比如 node1 的容器想要访问 node2 的容器,那么会匹配 node1 节点上这条路由规则:
[root@easzlab ~]# ip r
...
172.20.1.0/24 via 192.168.13.140 dev ens33这条路由规则会把目的 ip 地址属于 172.20.1.0/24 网段的 ip 包,应该经过本机的 ens33 设备发出去(即:dev ens33);并且,它下一跳地址(next-hop)是 192.168.13.140。
一旦配置了下一跳地址,那么接下来,当 ip 包从网络层进入链路层封装成帧的时候,ens33 设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。显然,这个 MAC 地址,正是 node2 的 MAC 地址。
node2 从数据帧里拿到 ip 包后,发现这个 ip 包的目的 ip 地址是 172.20.1.2,然后会匹配 node2 上面这条路由规则:
[root@localhost ~]# ip r
...
172.20.1.0/24 dev cni0 proto kernel scope link src 172.20.1.1然后会进入到 cni0 网桥,进而进入到对应容器中。
从上面我们可以知道 host-gw 模式能够正常工作的核心,就在于 ip 包在封装成帧发送出去的时候,会使用路由表里的下一跳来设置目的 MAC 地址。这样,它就会经过二层网络到达目的宿主机。所以说,Flannel host-gw 模式必须要求集群宿主机之间是二层连通的。 总结