系列导航
本系列从 Pod 网络连通入手,逐步展开到 K8s 网络全景。
① 概念 → ② Flannel → ③ Calico → ④ 流量路径 → ⑤ Cilium → ⑥ 对比 → ⑦ 排障 ‖ ⑧ 开发 → ⑨ 多网卡 → ⑩ AI 演进
| 顺序 | 文章 | 定位 |
|---|---|---|
| ① | 概念与入门 | 基础——主机网络、Docker 网络、CNI 标准、方案分类树 |
| ② | Flannel 详解 | CNI 实现——Overlay 封装(UDP/VXLAN/HostGW)与抓包 |
| ③ | Calico 详解 | CNI 实现——三层路由(BGP/IPIP)+ NetworkPolicy |
| ④ | 流量路径全解析 | 全貌——Pod/Service/Ingress/Egress,揭示 CNI 的边界 |
| ⑤ | 本篇 - Cilium 详解 | 超越 CNI——eBPF 统一 Pod + Service + L7 + Hubble |
| ⑥ | 插件对比与选型 | 选型——5 插件横向对比 + 决策树 |
| ⑦ | 排障思路与常用命令 | 运维——工具链 + 场景排查 + 性能 |
| — | 核心路径 ↑ | 扩展展望 ↓ |
| ⑧ | CNI 插件开发指南 | 扩展——基于 CNI 规范开发自定义插件 |
| ⑨ | 多网卡方案详解 | 进阶——Multus + SR-IOV/ipvlan 多网口实战 |
| ⑩ | AI 时代网络演进 | 展望——GPU 网络、eBPF 加速、未来方向 |
Cilium 的核心设计思想:用 eBPF 在 Linux 内核中编程网络数据路径——绕过传统的 iptables/ipvs,在内核态直接完成包的处理、转发、策略执行和可观测性数据采集。也意味着 kube-proxy 不再是必需品。
1. Cilium 架构
组件
Cilium Agent —— 每个节点上的 DaemonSet,监听 K8S API,将网络策略、服务端点转换为 eBPF 程序加载到内核。
eBPF Programs —— 编译后的字节码,挂载到 Linux 内核钩子点(XDP、TC Ingress/Egress、Socket),在数据包流经时执行。不经过用户态,不需要 iptables 规则遍历。
Hubble —— 基于 eBPF 的可观测层。每个节点运行 Hubble 实例,采集 eBPF 数据路径中产生的流日志、服务依赖关系、丢包事件。
Pod-Node 通信模型
Cilium 的 veth pair 对端直接挂在宿主机协议栈,每个 Pod 网卡在宿主机侧有一个对应接口(lxc_*)。Pod 流量进入宿主机后,TC(Traffic Control)挂载点上的 eBPF 程序接管,执行路由查找、策略检查、Service DNAT、封装/解封,全部在内核态完成。
与 Calico 的对比:
| 对比点 | Calico(BGP/IPIP) | Cilium(eBPF) |
|---|---|---|
| Service 处理 | 依赖 kube-proxy(iptables/IPVS) | eBPF 直接在内核态处理 Service,不需要 kube-proxy |
| 策略层 | L3/L4(iptables) | L3/L4/L7(eBPF + Envoy,支持 HTTP/gRPC/Kafka) |
| 数据路径 | 三层路由表 + 可选的 IPIP 隧道 | eBPF 程序在 TC 钩子点直接转发 |
| 可观测性 | 依赖外部工具(tcpdump/traceroute) | 内置 Hubble,原生采集 L7 协议指标 |
| 内核要求 | 无特殊要求 | 需要 >= 4.9(推荐 >= 5.2,支持全部 eBPF 特性) |
2. Cilium 后端模式
Cilium 四种后端,由简单到复杂:先看与已知 CNI 最相似的 Overlay(VXLAN → Geneve),再看 Cilium 独有的 Underlay(Direct Native → Direct Node)。
| backend | 适用场景 | 优点 | 限制 | 层次 | 实现方式 |
|---|---|---|---|---|---|
| VXLAN | 底层不支持直接路由,需标准 Overlay | 兼容性好,与 Flannel/Calico VXLAN 互通 | 有封装开销(~50B) | L2 Overlay | eBPF 内核态 VXLAN 封装 |
| Geneve | 需要 TLV 扩展元数据(多租户、策略标签) | 比 VXLAN 灵活 | 封装开销 ~46-60B | L2 Overlay | eBPF 内核态 Geneve 封装 |
| Direct Native | 自建机房、节点 L2 互通 | 性能最高,零封装 | 要求节点在同一个 L2 广播域 | 路由(不封装) | eBPF 直接转发 |
| Direct Node | 可用 BGP 或手动维护路由 | 不要求 L2 互通 | 需额外路由方案配合 | 路由(不封装) | eBPF 转发 + 外部路由分发 |
2.1 Overlay: VXLAN 模式
lxc_* 接口保留三层转发能力,TC 钩子上的 eBPF 程序统一处理路由查表、封装、解封,不需要独立的 VTEP 设备。2.1.1 组件概念
Cilium VXLAN 与 Calico VXLAN 的相同点:veth pair 两端都不降级,宿主机侧保留完整网卡能力,不经过 cni0 网桥。
关键差异——Calico 需要三样独立机制:路由表、vxlan.calico VTEP 设备、FDB 表。Cilium 把它们全部收进 eBPF:
| 数据平面组件 | Calico VXLAN | Cilium VXLAN |
|---|---|---|
| 路由查找 | 宿主机路由表(ip route) | eBPF Map(Cilium 维护的隧道端点表) |
| 封装设备 | vxlan.calico(独立 VTEP) | 无——eBPF 程序直接在 TC 钩子完成封装 |
| ARP 解析 | 宿主机 ARP 表 | eBPF 邻居发现 Map |
| FDB | 需要(VTEP MAC → 宿主机 IP) | 不需要——封装时直接查 eBPF Map |
| 对端 veth | cali* 接口 | lxc_* 接口(功能相同,命名不同) |
2.1.2 封装流程
S.Pod eth0 → veth pair → S.Host lxc_* 接口
→ TC Ingress hook: eBPF 程序接管
1. 查 eBPF Tunnel Map:D.Pod IP → D.Host IP
2. Service DNAT(如果是 Service 流量)
3. 策略检查(L3/L4/L7)
4. VXLAN 封装:外层 MAC + IP + UDP + VNI + 内层包
→ S.Host eth0 → 物理网络
→ D.Host eth0 → TC Ingress eBPF: 解 VXLAN 封装
→ D.Host lxc_* → veth → D.Pod eth0完整的路由、封装、策略执行压缩到一个 eBPF 程序中。Calico VXLAN 的每一步对应一个独立的内核组件(路由表 / vxlan.calico / iptables),Cilium 全部统一在 eBPF Map + TC 钩子。
2.1.3 路由规则对比
Cilium 与 Calico 一样,veth 不降级 → 每个 Pod 一条 /32 路由。但路由不在宿主机主路由表中,而是在 eBPF Map 内:
| |
2.2 Overlay: Geneve 模式
2.2.1 组件概念
Geneve(Generic Network Virtualization Encapsulation)是 VXLAN 的演进协议。与 VXLAN 的固定报头不同,Geneve 支持 TLV(Type-Length-Value)扩展:
| 对比维度 | Cilium VXLAN | Cilium Geneve |
|---|---|---|
| 封装开销 | ~50B | ~46B(空 TLV)~ 60B(含 TLV) |
| 报头格式 | 固定 8B VXLAN 头(VNI) | 可变长度 Geneve 头(VNI + TLV 链) |
| 元数据携带 | 仅 VNI(24bit 标识符) | 可携带多租户标签、策略 ID、安全组等 |
| 多租户 | 受 VNI 数量限制(2²⁴) | TLV 扩展,理论上无限 |
| 内核支持 | >= 3.16 | >= 4.10 |
2.2.2 封装流程
流程与 VXLAN 完全相同,差异仅在 eBPF 程序的封装步骤——用 Geneve 头替换 VXLAN 头:
| |
TLV 扩展示例——Cilium 利用 Geneve TLV 在多租户场景传递策略 ID:
| |
2.3 Underlay: Direct Native 模式
2.3.1 组件概念
Direct Native 是 Cilium 性能最高的模式。节点 L2 互通时,Pod 流量不经过任何隧道——eBPF 在 TC 钩子完成路由查表后直接封装 L2 头发出。
2.3.2 主要流程
S.Pod eth0 → veth pair → S.Host lxc_* 接口
→ TC Ingress eBPF:
1. 查 eBPF Map 确定 D.Pod 所在节点 IP
2. Service DNAT
3. 策略检查
4. 封装 L2 头(目标 MAC = D.Host MAC)
→ S.Host eth0 → 物理网络
→ D.Host eth0 → TC Ingress eBPF → lxc_* → D.Pod2.4 Underlay: Direct Node 模式
2.4.1 组件概念
Direct Node 去掉了 L2 互通的前提——Pod 子网路由由外部组件(Calico BIRD、BGP 路由器、手动 ip route)维护,Cilium 只负责 eBPF 层面的转发和策略。
| |
3. eBPF 替换 kube-proxy
这是 Cilium 区别于其他 CNI 的核心能力。传统方案中 kube-proxy 监控 Service/Endpoint 变化,写入 iptables 规则或 IPVS 表完成 Service 到 Pod 的 DNAT。Cilium 直接将 Service → Endpoint 映射写入 eBPF Map,由 TC 钩子上的 eBPF 程序完成 DNAT。
| |
两者对比:
| 维度 | kube-proxy (iptables) | kube-proxy (IPVS) | Cilium eBPF |
|---|---|---|---|
| 规则更新 | 全量替换(大规模时延迟高) | 增量 | 增量(eBPF Map 操作) |
| 匹配复杂度 | O(n) 遍历 | O(1) 哈希 | O(1) 哈希 |
| L7 能力 | 无 | 无 | 支持(HTTP/gRPC/Kafka 级别策略) |
| 可观测性 | 外部工具 | 外部工具 | 内置 Hubble(L7 协议解析) |
| 连接跟踪 | 依赖 conntrack | 依赖 conntrack | 独立的 eBPF conntrack,无全局锁争用 |
适用场景: Service 数量 >1000 的集群从 iptables 迁移到 Cilium eBPF 后,Service 变更引起的连接中断和延迟尖峰现象消失。
4. 网络策略
Cilium 支持三层策略粒度:
| 策略级别 | 实现方式 | 示例 |
|---|---|---|
| L3 | eBPF 程序过滤源/目标 IP | 只允许 namespace=frontend 访问 namespace=backend |
| L4 | eBPF 程序过滤端口和协议 | 只允许 TCP/8080 进入 backend |
| L7 | eBPF 将流量代理到 Envoy,做协议级策略 | 只允许 GET /api/v1/users,拒绝 DELETE /admin |
| |
对于 L7 策略,eBPF 将匹配的流量通过套接字重定向到本节点 Envoy 代理,Envoy 做协议解析和策略比对后回注。这比传统 iptables + Service Mesh sidecar 方案少了一跳网络转发。
5. Hubble 可观测性
Hubble 是 Cilium 的原生可观测层,数据来源是 eBPF 程序在数据路径上埋的监控点。
开箱能力:
- 服务依赖图 —— 自动生成 namespace/service 之间的调用关系拓扑
- 流日志 —— 每条连接的五元组 + L7 协议信息(HTTP method/path/status code)
- 丢包原因 —— eBPF 在策略拒绝、路由失败时记录精确的丢包原因
- 网络性能 —— TCP 握手延迟、重传次数
| |
与传统 tcpdump 的区别:Hubble 的数据直接来自内核 eBPF Map,不需要抓包,无性能损耗。每个节点每分钟可处理百万级事件。
6. 总结
| 维度 | Flannel | Calico | Cilium |
|---|---|---|---|
| 数据路径 | 用户态/内核态 Overlay | BGP/IPIP 三层路由 | eBPF 内核态编程 |
| Service | 依赖 kube-proxy | 依赖 kube-proxy | eBPF 替换 kube-proxy |
| 策略 | 无(Flannel)/ L3-L4(Calico) | L3-L4(iptables) | L3-L4-L7(eBPF + Envoy) |
| 可观测性 | 外部工具 | 外部工具 | 原生 Hubble |
| 性能 | 中 | 高 | 最高(无 iptables 遍历) |
| 内核要求 | 无 | 无 | >= 4.9(推荐 >= 5.2) |
Cilium 适合对网络性能、可观测性和 L7 策略有需求的生产环境。eBPF 是 K8S 网络的未来方向,但不适合低内核版本的存量集群——升级内核是新部署的成本。