文章

Cilium 网络与路由模式

Cilium 网络与路由模式

两种根本模式:Native Routing vs Tunnel

Cilium 跨节点通信有两条路,选哪个决定是否需要 overlay 封装

┌───────────────────────── Native Routing ─────────────────────────┐
Pod-A(10.0.1.5) → veth → host → 直接路由到 Node2 的 eth0            │
  (Pod IP 在底层网络可达,靠 BGP/直连/云路由表)                      │
  无封装,MTU 仍是 1500,性能最佳                                      │
└──────────────────────────────────────────────────────────────────┘

┌───────────────────────── Tunnel 模式 ────────────────────────────┐
Pod-A(10.0.1.5) → veth → host → [VXLAN/Geneve 封装] → 隧道 → Node2 │
  (Pod IP 在底层不可达,靠隧道把 Pod 包包进节点 IP 里传输)            │
  有封装开销,MTU 需降到 1450(VXLAN)/1440(Geneve)                     │
└──────────────────────────────────────────────────────────────────┘
维度Native RoutingTunnel (VXLAN/Geneve)
封装有(VXLAN 50B / Geneve 因选项可变)
MTU1500(无需降)1450 / 1440
Pod IP 可达性要求底层路由可达(BGP/云路由表)不要求,节点 IP 通即可
跨子网需要底层路由配合天然支持
性能最高略低(封装/解封 + 降 MTU 分片风险)
适用BGP 数据中心、云有 VPC 路由注入快速起步、无 BGP 的环境
# Native Routing(需底层已能路由 Pod CIDR)
routingMode: native
kubeProxyReplacement: true
# 配合:云厂商把 Pod CIDR 注入 VPC 路由表,或节点间跑 BGP(如 Calico BGP / bird)

# Tunnel 模式
tunnel: vxlan          # 或 geneve
# 默认 encapsulation: "vxlan"

Pod IP 分配(IPAM)

Cilium 支持多种 IPAM 模式,决定”Pod IP 从哪来”:

模式说明
host-scope(默认)每个节点从本机预留的 CIDR 块分配,类似 host-local
cluster-scope全局分配器,避免跨节点 CIDR 碎片
Multi-pool (CRD)CiliumPodIPPool 自定义多个地址池(可指定 IPv4/IPv6、特定网段)
AWS ENI / Azure IPAM直接用云厂商 secondary IP,Pod IP 即 VPC IP(无 NAT 出网)
Kubernetes 原生复用 kube-controller 分配的 PodCIDR

Multi-pool 示例(多租户/多网段常用):

apiVersion: cilium.io/v2alpha1
kind: CiliumPodIPPool
metadata:
  name: pool-a
spec:
  ipv4:
    cidrs:
      - 10.10.0.0/16
---
# Pod 通过 annotation 选池
metadata:
  annotations:
    ipam.cilium.io/ip-pool: pool-a

Masquerade(出网 SNAT)

Pod 访问集群外时,源 IP 需要变成节点 IP(否则回包回不来)。Cilium 用 eBPF 做 SNAT,不依赖 iptables MASQUERADE:

bpf:
  masquerade: true        # eBPF 实现 SNAT(默认)
  # masquerade 默认对 Pod CIDR 外的流量做 SNAT
  • 开启后,iptables -t nat -L 里看不到 MASQUERADE 规则——这是 KPR 排查时的典型”迷惑点”
  • 可用 enableIPv4Masquerade: false 关闭(当云环境已用 ENI 等让 Pod IP 直接可达外网时)

MTU 计算(最容易踩坑)

物理网卡 MTU = 1500
VXLAN 封装:1500 - 50 (VXLAN/UDP/IP) = 1450  ← Pod 网卡 MTU
Geneve 封装:1500 - 因为 Geneve 头可变,通常 1440
# Big TCP(Cilium 1.16+,内核 5.19+ GRO/GSO):可把 GSO 段放到 64K,
# 即使 MTU 1500,也能减少 per-packet 开销(仅容器内 effective,线速仍受 MTU 限)

跨节点大包丢包、偶发 TLS 超时,十有八九是 MTU 不匹配。查法:两节点互 ping 带 -s 1400 -M do 逐步加大,找到能通的最大包。

Host Networking(节点本机流量)

  • Host Firewall 开启后,Cilium 对 host 命名空间的流量也加载 eBPF 策略(保护节点 SSH/API 等)
  • hostRouting: true 时,节点访问 Pod / Pod 访问节点的流量走 host 路由而非绕隧道
  • 节点本机的 cilium_host 接口是 host 与 Pod 网络互通的桥

模式选择决策

跨节点怎么通?
├── 底层能路由 Pod CIDR(BGP / 云路由注入)→ Native Routing(性能最佳)
└── 不能 → Tunnel (VXLAN/Geneve)
        └── 跨子网且想少封装 → 考虑云 ENI IPAM(Pod IP 即 VPC IP)

与底层网络的关系(排障关键)

现象根因查法
跨节点 Pod 不通,同节点通Tunnel 端口/路由问题,或 Native Routing 下 Pod CIDR 未注入底层路由cilium statusip routetcpdump 看是否有封装
大包丢、TLS 偶超时MTU 不一致ping -s 1400 -M do 两端测
Pod 出网不通masquerade 未开或 SNAT 规则缺失cilium bpf nat list
节点 SSH 被挡Host Firewall 策略误伤检查 CiliumClusterwideNetworkPolicy 的 host 规则

关联知识

学习时间

阶段时间备注
网络路由2026-07-16完成:Native vs Tunnel、IPAM 多模式、Masquerade、MTU、Host 网络、决策