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 通信的数据路径差异:

Overlay 模式 vs Native Routing 模式数据路径对比 Overlay 模式 vs Native Routing 模式数据路径 Overlay 模式(VXLAN/Geneve) 节点 A Pod A (10.0.1.2) cilium_vxlan UDP 封装(50 字节) 节点 B Pod B (10.0.2.3) cilium_vxlan 封装后 UDP 流 解封装还原原始包 Native Routing 模式 节点 C Pod C (10.0.3.4) 路由表(/32) 节点 D Pod D (10.0.4.5) 路由表(/32) 原生 IP 路由 无封装,直接转发 关键差异总结 • Overlay:Pod A → cilium_vxlan → UDP 封装 → 物理网络 → 节点 B 解封装 → Pod B • Native:Pod C → 节点 C 路由表 → 物理网络(原生 IP)→ 节点 D 路由表 → Pod D • Overlay 增加 50 字节头部,MTU 需降为 1450;Native 无额外开销,MTU 可达 1500 • Overlay 对底层网络透明;Native 要求节点间路由可达或 BGP 同步

4.6 选型决策树与生产建议

根据服务目录平台的实际环境,可参考以下决策树选择网络模式:

  1. 底层网络是否支持 Pod CIDR 路由?
    • 是 → 考虑 Native Routing
    • 否 → 使用 Overlay
  2. 是否需要跨集群互联(Cluster Mesh)?
    • 是 → Overlay 模式更简单(隧道天然跨集群)
    • 否 → 可考虑 Native Routing
  3. 性能敏感度如何?
    • 高(如实时音视频、高频交易)→ Native Routing
    • 中等 → Overlay 足够
  4. 运维团队对 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 命令进行全链路测试。