4. Cilium 网络模式选择:Overlay 模式(VXLAN/Geneve)与 Native Routing 模式对比与配置
在服务目录平台环境中,Cilium 的数据路径决定了 Pod 间流量的封装、转发效率以及底层网络设施的耦合度。本章深入对比 Cilium 的两种核心网络模式:Overlay 模式(VXLAN / Geneve)与 Native Routing 模式,并给出基于生产环境的配置示例与选型建议。
4.1 模式概述与核心差异
Cilium 默认使用 Overlay 模式,通过隧道封装实现跨节点 Pod 通信,对底层网络拓扑无特殊要求。Native Routing 模式则依赖节点路由表与底层网络设备(如 ToR 交换机、云厂商 VPC 路由表)直接转发,性能更优但运维复杂度更高。
| 对比维度 | Overlay 模式(VXLAN / Geneve) | Native Routing 模式 |
|---|---|---|
| 封装开销 | VXLAN 50 字节 / Geneve 50+ 字节(含可选 TLV) | 无额外封装,直接基于 L3 路由 |
| MTU 要求 | 需设置 Pod MTU = 物理 MTU - 封装头(通常 1450) | Pod MTU 可直接等于物理 MTU(通常 1500) |
| 底层依赖 | 仅需三层可达,不依赖二层或 VPC 路由表 | 依赖节点路由表、BGP 或云厂商路由表同步 |
| 性能 | 中等,CPU 需处理封装/解封装 | 高,接近宿主机网卡线速 |
| 可观测性 | 封装后原始包信息被隐藏,tcpdump 需抓隧道口 | 直接可见原始包,排障更直观 |
| 多集群互联 | 天然支持跨集群隧道(Cluster Mesh) | 需额外配置路由泄露或 BGP 跨集群 |
| 典型场景 | 公有云、异构网络、快速部署 | 私有云、高性能计算、低延迟服务目录 |
选型提示: 服务目录平台若运行在 AWS/GCP/Azure 等公有云且节点间网络延迟敏感,优先考虑 Native Routing 模式配合 Cilium BGP 或云 VPC CNI 集成;若平台跨多个异构数据中心或需快速上线,Overlay 模式更稳妥。
4.2 Overlay 模式:VXLAN 与 Geneve 对比
Cilium 支持两种隧道协议:VXLAN(RFC 7348)和 Geneve(RFC 8926)。两者均基于 UDP 封装,但 Geneve 提供更灵活的扩展头部(TLV),适合需要携带元数据的场景(如服务网格、安全策略上下文)。
| 特性 | VXLAN | Geneve |
|---|---|---|
| UDP 端口 | 4789(IANA 分配) | 6081(IANA 分配) |
| 头部固定长度 | 50 字节(8 VNI + 42 外部头) | 50 字节(8 基础 + 42 外部头) |
| 扩展选项 | 无 | 支持可变长 TLV(最多 64 字节) |
| VNI 空间 | 24 位(约 1600 万) | 24 位(约 1600 万) |
| 硬件卸载 | 广泛支持(SmartNIC、DPU) | 部分高端网卡支持 |
| Cilium 默认 | 是(v1.14 及之前) | 可选(v1.15+ 推荐) |
生产建议: 若网卡支持 Geneve 硬件卸载且需要携带 eBPF 元数据(如 Identity、Endpoint 信息)到隧道对端,优先选择 Geneve;否则 VXLAN 兼容性更广,运维更简单。
4.3 Overlay 模式配置示例
以下 Helm 配置启用 VXLAN Overlay 模式(Cilium v1.15+):
helm upgrade --install cilium cilium/cilium --version 1.15.5 \
--namespace kube-system \
--set tunnelProtocol=vxlan \
--set routingMode=tunnel \
--set ipam.mode=kubernetes \
--set autoDirectNodeRoutes=false \
--set ipv4NativeRoutingCIDR=10.0.0.0/8
若切换为 Geneve:
--set tunnelProtocol=geneve \
--set routingMode=tunnel
验证隧道接口:
# 查看节点上的 cilium_vxlan 或 cilium_geneve 接口
ip link show type vxlan
ip link show type geneve
# 确认 Cilium 隧道模式
kubectl -n kube-system exec ds/cilium -- cilium status | grep "Tunnel"
避坑: 若底层网络 MTU 为 1500,VXLAN 模式必须设置 Pod MTU 为 1450,否则会导致分片丢包。Cilium 自动计算 MTU 时需确保
--set mtu=1450 或依赖节点接口 MTU 检测。
4.4 Native Routing 模式配置示例
Native Routing 模式要求节点间路由可达,且 Cilium 需要将 Pod CIDR 路由注入到节点路由表或 BGP 对等体。以下为基于直接路由(Direct Routing)的配置:
helm upgrade --install cilium cilium/cilium --version 1.15.5 \
--namespace kube-system \
--set routingMode=native \
--set ipam.mode=kubernetes \
--set autoDirectNodeRoutes=true \
--set ipv4NativeRoutingCIDR=10.0.0.0/8 \
--set bpf.masquerade=true \
--set enableIPv4Masquerade=false
关键参数说明:
routingMode=native:关闭隧道,启用原生路由。autoDirectNodeRoutes=true:Cilium 自动将其他节点的 Pod CIDR 添加到本地路由表。ipv4NativeRoutingCIDR:指定集群 Pod CIDR 范围,Cilium 会为该范围内的流量启用原生路由。bpf.masquerade=true:使用 eBPF 进行 SNAT,避免 iptables 性能瓶颈。
验证路由表:
# 查看节点路由表,应出现 /32 或 /24 的 Pod CIDR 路由
ip route show proto bird
# 或
ip route | grep 10.0.
# 确认 Cilium 路由模式
kubectl -n kube-system exec ds/cilium -- cilium status | grep "Routing"
4.5 数据路径对比示意图
下图展示 Overlay 模式与 Native Routing 模式下,跨节点 Pod 通信的数据路径差异:
4.6 选型决策树与生产建议
根据服务目录平台的实际环境,可参考以下决策树选择网络模式:
- 底层网络是否支持 Pod CIDR 路由?
- 是 → 考虑 Native Routing
- 否 → 使用 Overlay
- 是否需要跨集群互联(Cluster Mesh)?
- 是 → Overlay 模式更简单(隧道天然跨集群)
- 否 → 可考虑 Native Routing
- 性能敏感度如何?
- 高(如实时音视频、高频交易)→ Native Routing
- 中等 → Overlay 足够
- 运维团队对 BGP / 路由表管理是否熟悉?
- 熟悉 → Native Routing + BGP
- 不熟悉 → Overlay 降低复杂度
服务目录平台最佳实践: 若平台部署在私有云且网络团队可配合配置 BGP,推荐 Native Routing 模式 + Cilium BGP 控制平面(CiliumBGPPeeringPolicy),可获得最佳性能与可观测性。若在公有云多租户环境,Overlay 模式(Geneve)配合 Cluster Mesh 是更安全、隔离性更好的选择。
4.7 模式切换注意事项
从 Overlay 切换到 Native Routing(或反之)属于破坏性变更,需注意:
- 所有现有 Pod 会被重建,因为 CNI 配置和数据路径发生变化。
- MTU 设置需同步调整,避免 Pod 启动后出现分片。
- 若使用 NetworkPolicy,两种模式下策略语义一致,无需修改。
- 建议在维护窗口执行,并提前验证目标模式的 Helm 参数。
# 切换前备份现有配置
helm get values cilium -n kube-system > cilium-values-backup.yaml
# 执行升级切换(以 Overlay 切 Native 为例)
helm upgrade cilium cilium/cilium -n kube-system \
--reuse-values \
--set routingMode=native \
--set autoDirectNodeRoutes=true \
--set tunnelProtocol=disabled
# 重启所有 Pod 以应用新网络模式
kubectl delete pods --all -n <your-namespace>
重要: 切换后务必验证跨节点 Pod 连通性、DNS 解析、以及 NetworkPolicy 是否正常生效。建议使用
cilium connectivity test 命令进行全链路测试。