Flannel host-gw模式

Flannel 支持3种后端实现模式

1 VXLAN
2 host-gw
3 UDP

其中UDP是最早支持的一种方式,但是由于性能问题已经被弃用

当设置Flannel 使用 host-gw 模式之后,flannel会在宿主机上创建

$ ip route
10.244.1.0/24 via 10.168.0.3 dev eth0

目标地址是 10.244.1.0/24 网段的 IP数据包 应该 经由本机的 eth0 设备 (dev eth0) 发出,并且它的下一跳(next-hop) 地址是 10.168.0.3 (via 10.168.0.3)

所谓 next hop 就是如果 ip 包从 主机 A 发送到 主机 B ,需要经过路由设备 X 中转。那么X 的 IP 地址 就应该是主机A的下一跳地址。

一旦配置了next hop ,那么当 IP数据包从网络层进入链路层封装成 帧 时,eth0设备会使用下一跳地址对应的MAC地址,作为数据帧的目的MAC地址。 显然 容器1 (node1) 的数据包的下一跳地址应该是 node2 ,然后通过node2 到达 容器2,这样 这个数据帧就会从Node1 通过宿主机的二层网络(IP地址是三层网络)顺利到达Node2

Node2的内核网络栈从二层数据帧里获取 IP包后,会看到这个IP包的地址是 10.244.1.3 (10.244.1.0/24)

host-gw 的含义在于,每个容器所在的 host (宿主机)会充当这条容器通信路径里的 gateway ( 网关)

Flannel 子网和主机的信息都保存在 etcd 中,flanneld 会watch这些数据的变化,然后实时更新路由表即可。

优点:

容器通信的过程免除了额外的封包和解析带来的性能开销。host-gw的性能损失大概在 10%,而其他所有基于VXLAN 隧道机制的网络方案的性能损失在 20%-30%

缺点:

Flannel host-gw 模式要求集群宿主机之间是二层连通的,而在Kubernetes中,对宿主机的要求是 三层 连通的,也就是必须可以通过IP通信

Send a Message