Flannel HOST-GW模式 电脑版发表于:2022/12/7 17:26  ># Flannel HOST-GW模式 [TOC] tn2>在讲Flannel HOST-GW模式之前我们可以先来看看静态路由。 ## 静态路由 tn2>简单讲:网络管理员在路由器上手动配置的路由条目;当网络拓扑改变时,需要让管理员手动的更新路由条目;路由过程必须根据管理员的配置转发。 当我们以主机为路由的时候,我们可以通过docker来实现linux下的静态路由。  tn>主机k8s-1下,我们首先自定义一个Linux Bridge,并设置网段为`172.19.0.0/16`取名名为`br_net19`;然后创建一个c1容器并连接到我们的`br_net19`网桥中。最后添加`172.18.0.0/16`网络的路由指向k8s-2节点中ip为`10.211.55.12`。 命令如下所示: ```bash docker network create -d bridge --subnet 172.19.0.0/16 br_net19 docker network list docker run --name c1 --network br_net19 -td burlyluo/nettoolbox docker ps -a docker exec -it c1 ifconfig docker exec -it c1 route -n ifconfig route -n # docker exec -it c1 ping 172.18.0.2 # route add -net 172.18.0.0/16 gw <节点二ip> # 添加静态路由 route add -net 172.18.0.0/16 gw 10.211.55.12 ``` tn2>大致如节点一的操作 ```bash docker network create -d bridge --subnet 172.18.0.0/16 br_net18 docker network list docker run --name c2 --network br_net18 -td burlyluo/nettoolbox docker ps -a docker exec -it c2 ifconfig docker exec -it c2 route -n ifconfig route -n # route add -net 172.19.0.0/16 gw <节点一ip> # 添加静态路由 route add -net 172.19.0.0/16 gw 10.211.55.11 route -n ```  tn2>尝试ping,是没什么问题的。  ## Flannel HOST-GW模式 tn2>与静态路由是一样的,唯一不同的就是添加静态路由的时候,由 `flanneld` 负责了设置各个节点上的路由。  tn2>那么我们应该如何进行安装呢? 只需要将`net-conf.json`文件的网络类型更改为`host-gw`模式即可。 ```bash wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml vim kube-flannel.yml # net-conf.json: | # { # "Network": "10.244.0.0/16", # "Backend": { # "Type": "host-gw" # } # } kubectl apply -f kube-flannel.yml ``` tn2>由于走的是二层,所以不需要进行封包,性能也就提高了。但是HOST-GW模式只支持宿主机之间二层连接,要求集群中所以节点必须处于同一个网络中。如果不在一个网络中,三层设备路由器缺少Pod 网络的路由规则,无法转发数据包。<br/> HOST-GW模式将目的主机当作网关,直接路由原始的数据包。flanneld会在集群节点上创建并维护路由表,当数据包到达集群节点的时,就会根据路由表直接发送到下一跳,也就是同网段的节点IP,直接通过二层网络将数据转发到目的节点上;目的节点再根据路由表规则转发到cni网桥,网桥根据路由规则转发到容器里面。<br/> HOST-GW模式通过路由转发实现高性能网络通信,但是这种模式局限性很大,节点之间都要相互有点对点的路由覆盖,每个节点上有n-1个路由,而n个节点共有n(n-1)/2个路由,才能保证flannel的flat网络能力。 ## 小结 tn2>Host-GW特点: -- 直接路由转发,性能损失很小 -- 对宿主机网络要求二层可达 -- 如果主机数量多了起来导致泛洪