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 Routing | Tunnel (VXLAN/Geneve) |
|---|---|---|
| 封装 | 无 | 有(VXLAN 50B / Geneve 因选项可变) |
| MTU | 1500(无需降) | 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 status、ip route、tcpdump 看是否有封装 |
| 大包丢、TLS 偶超时 | MTU 不一致 | ping -s 1400 -M do 两端测 |
| Pod 出网不通 | masquerade 未开或 SNAT 规则缺失 | 看 cilium bpf nat list |
| 节点 SSH 被挡 | Host Firewall 策略误伤 | 检查 CiliumClusterwideNetworkPolicy 的 host 规则 |
关联知识
- Cilium 知识总览 — 入口
- Cilium 架构与数据面组件 — eBPF 程序如何执行这些路由/NAT
- ../k8s/网络架构/K8s 网络架构总览 — K8s 网络模型背景
- ../k8s/特性详解/CNI 网络插件对比与排障 — 与 Calico BGP 模式对比
- ../linux/网络内核参数调优 — MTU、conntrack、rp_filter 等内核参数
学习时间
| 阶段 | 时间 | 备注 |
|---|---|---|
| 网络路由 | 2026-07-16 | 完成:Native vs Tunnel、IPAM 多模式、Masquerade、MTU、Host 网络、决策 |