Flannel 为 Kubernetes 集群中的容器主要提供了三种网络通信模式:VXLAN、host-gw 以及 UDP 。它们在工作原理和性能上有所不同,你可以根据实际的网络环境和需求进行选择。
下面这个表格整理了这三种核心模式的关键信息,帮助你快速了解和对比:
| 网络模式 | 技术原理 | 性能 | 适用场景 |
|---|---|---|---|
| VXLAN | 在内核态进行封包/解包,创建虚拟隧道(flannel.1设备) | 性能较好 | 通用场景,跨网段通信,是生产环境常用模式 |
| host-gw | 纯三层路由,通过在主机上添加路由规则,将目的主机作为网关 | 性能最高(无封装开销) | 二层互通的网络,对性能要求高 |
| UDP | 在用户态进行封包/解包,通过TUN设备(flannel0)转发 | 性能最差 |
-
VXLAN模式:这是Flannel默认且在生产环境中最常用的模式。它在每个节点上创建一个叫
flannel.1的VTEP(虚拟隧道端点)设备。当数据包需要发送到其他节点上的Pod时,内核会在原始数据包外封装一层新的UDP包,使用宿主机的网络进行传输,到达目标节点后再由内核解封装。这种方式虽然有一定开销,但可以跨越三层网络,灵活性很好。 -
host-gw模式 (Host Gateway):这种模式性能最好。它通过在每个节点上添加到达其他节点Pod子网的静态路由规则来实现通信,下一跳就是目标节点本身的IP地址。因为它不需要对数据包进行任何封装,直接使用原始IP包传输。但关键限制是,它要求集群所有节点处于同一个二层网络(即直接可以通过二层交换通信),否则路由无法生效。
-
UDP模式:这是Flannel最早支持的模式。它与VXLAN类似,也是Overlay网络,但封包和解包工作由运行在用户空间的
flanneld进程完成,导致频繁的内核态和用户态切换,性能损耗非常大,通常不推荐在生产环境使用。
Flannel 的 VXLAN 和 host-gw 模式可以通过一种称为 Directrouting 的配置实现“一起使用” 。这种混合模式能智能地选择最佳的数据传输方式,兼顾灵活性和性能。
下面这个表格清晰地展示了这三种方式的主要特点:
| 特性模式 | 工作原理 | 性能 | 配置复杂性 | 网络要求 |
|---|---|---|---|---|
| VXLAN | 通过隧道封装数据包,可跨越三层网络 | 有封装开销,性能稍低 | 中等 | 无特殊要求,通用性强 |
| host-gw | 通过主机路由表直接转发,无封装 | 性能最高,接近原生网络 | 简单 | 所有节点必须在同一二层网络 |
| Directrouting (混合) | 同子网走host-gw,跨子网走VXLAN | 同子网内性能与host-gw相当 | 中 |
如何配置 Directrouting 模式
配置的核心是修改 Flannel 的 ConfigMap。
-
修改 Flannel 配置文件
通常,Flannel 的配置保存在名为kube-flannel-cfg的 ConfigMap 中,或者直接在部署的 YAML 文件里。你需要找到net-conf.json部分,将其修改为如下结构 :net-conf.json: |{"Network": "10.244.0.0/16", # 这里替换为你的集群 Pod 网段"Backend": {"Type": "vxlan","Directrouting": true # 关键:启用直接路由}}
-
网络前提是关键:要使 Directrouting 生效并发挥其性能优势,处于同一 IP 子网内的节点之间必须能够通过二层网络(数据链路层)直接通信 。如果同子网的节点间存在防火墙等三层隔离设备,host-gw 的直连路由将无法建立。
-
MTU 设置:纯 VXLAN 模式由于需要封装数据,MTU 需要减小(例如设置为 1450)以容纳额外的头部信息 。而 host-gw 模式没有额外封装,可以使用标准的 1500 MTU 。在 Directrouting 混合模式下,为了兼容性,可能仍需采用 VXLAN 的较小 MTU。如果你的网络环境确认支持更大的 MTU,可以尝试调整。
-
配置校验:配置完成后,你可以通过
ip route命令在节点上查看路由表。如果配置成功,对于同一子网内的其他节点,你应该能看到一条类型为host-gw的清晰路由,其下一跳网关就是目标节点的 IP。
-