第276篇:Flannel、Calico、Cilium 方案对比
关键词
Flannel、Calico、Cilium、CNI 对比、eBPF、BGP、VXLAN、网络策略、性能基准
一、Flannel
1.1 架构
Flannel 是最简单的 CNI 插件——专注于 Pod 间网络连通:
Flannel 架构:
┌──────────────────────────────────────────┐ │ etcd / Kubernetes API │ │ (存储子网分配信息) │ └────────────────┬─────────────────────────┘ │ | flanneld(每个节点一个) ┌────────────────────────────────┐ | 从 etcd 获取子网分配信息 配置路由和隧道 更新主机路由表 | | | --- | --- | --- |
Flannel 后端模式:
-
VXLAN(默认) ┌─ 节点间使用 VXLAN 隧道 ├─ 内核 VXLAN(无额外守护进程) └─ 性能:~7Gbps(100G 链路)
-
host-gw(主机网关) ┌─ 直接写主机路由(无隧道) ├─ 通过节点的物理 IP 路由 Pod IP ├─ 需要节点二层互通 └─ 性能:~线速(无封装开销)
-
UDP(最慢,已淘汰) ┌─ 用户态封装 └─ 性能差(~1Gbps)
1.2 Flannel 的特点
优点:
1. 简单——配置少,上手快
2. 轻量——flanneld 占用资源少
3. 稳定——大规模部署验证
4. 兼容——支持大多数 Linux 发行版
缺点:
1. 无 NetworkPolicy——不支持 K8s 网络策略
2. 无加密——隧道未加密(可配合 IPSec)
3. 无细粒度控制——全局策略,不可精细化
4. 性能——VXLAN 模式有 5-10% 开销
适用场景:
- 小型集群(< 50 节点)
- 网络策略不需要
- 追求简单部署
- 测试/开发环境
安装:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
二、Calico
2.1 架构
Calico 是功能最全面的 CNI 插件——网络连通 + 安全策略:
Calico 架构:
| Felix(每个节点一个) ┌────────────────────────────────┐ └────────────────────────────────┘ | 配置网络接口(veth pair) 管理 iptables 规则(策略实现) 更新路由表 | |
|---|---|---|
| BIRD(BGP 客户端) ┌────────────────────────────────┐ └────────────────────────────────┘ | 向其他节点通告 Pod 路由 支持 BGP Route Reflector | |
| Typha(大规模集群可选) ┌────────────────────────────────┐ | 减少 Felix 对 API Server 的压力 聚合策略变更通知 |
Calico 数据面模式:
-
BGP(默认) ┌─ 通过 BGP 交换 Pod 路由 ├─ Pod IP 直接路由(无隧道封装) ├─ 需要节点二层互通(或 BGP 到 ToR 交换机) └─ 性能:线速(无封装)
-
VXLAN / IPIP ┌─ 通过隧道封装跨子网流量 ├─ IPIP 封装(比 VXLAN 少 4 字节) ├─ 不需要二层互通 └─ 性能:VXLAN ~95%,IPIP ~97%
-
eBPF(实验性) ┌─ 用 eBPF 替代 iptables ├─ 更高性能 └─ 需要内核 5.3+
2.2 Calico 的特点
优点:
1. NetworkPolicy——完整的 K8s 网络策略支持
2. 高性能——BGP 模式无封装
3. 安全——支持全局网络策略、命名空间隔离
4. 可扩展——支持大规模集群(1000+ 节点)
5. 灵活——BGP/VXLAN/IPIP/eBPF 多种数据面
6. 加密——支持 WireGuard 隧道加密
缺点:
1. 复杂——配置比 Flannel 复杂得多
2. BGP 依赖——BGP 模式需要 ToR 交换机支持
3. iptables 性能——大规模策略 iptables 规则膨胀
4. 学习曲线——Felix/BIRD/Typha 组件多
适用场景:
- 生产集群(所有规模)
- 需要网络策略
- 多租户/安全敏感
- 已有 BGP 基础设施
安装:
kubectl create -f https://docs.projectcalico.org/manifests/calico.yaml
三、Cilium
3.1 架构
Cilium 是新一代 CNI——基于 eBPF 技术:
Cilium 架构:
| Cilium Agent(每个节点一个) ┌────────────────────────────────┐ └────────────────────────────────┘ | eBPF 程序管理 - XDP(早期丢包/转发) - TC(流量控制 hook) - cgroup hook(套接字级) | |
|---|---|---|
| Cilium Operator(集群级) ┌────────────────────────────────┐ └────────────────────────────────┘ | 状态管理 负载均衡器 IP 池管理 | |
| Hubble(可观测性) ┌────────────────────────────────┐ | 网络流量可视化和监控 服务地图、依赖关系识别 |
Cilium 数据面: eBPF 程序直接挂载到网络 hook 点: - eth0 入口:XDP 程序(最快的丢包决策) - eth0 入口:TC 程序(流量转发) - cgroup:套接字级别策略(identity-based)
关键特性: 无 iptables——全部用 eBPF 替代 无 conntrack——eBPF maps 替代 身份标识(Identity)——基于标签的 L3/L4/L7 策略
3.2 Cilium 的特点
优点:
1. 极致性能——eBPF 绕过 iptables,PPS 高 3-5x
2. 细粒度策略——L3/L4/L7(HTTP/gRPC/Kafka)策略
3. Hubble 可观测性——流量可视化、延迟分析
4. Service 替代——eBPF 直接处理 Cluster IP(性能更好)
5. 透明加密——WireGuard 集成
6. 可编程——eBPF 程序按需加载
缺点:
1. 内核要求——需要 Linux 5.10+(部分特性需要更新)
2. 新技术——相对不成熟(虽然已生产就绪)
3. 调试复杂——eBPF 问题排查需要专业知识
4. 资源占用——eBPF map 占用内核内存
适用场景:
- 高性能要求(HPC、AI、金融)
- 需要 L7 策略(服务网格替代)
- 大规模集群(10K+ 节点)
- 需要深度可观测性
安装:
cilium install
四、三方对比
4.1 功能对比
| 特性 | Flannel | Calico | Cilium |
|---|---|---|---|
| 部署复杂度 Pod 连通 NetworkPolicy L7 策略 服务负载均衡 加密 可观测性 IPv6 多集群 Windows | 简单 ✓ ✗ ✗ kube-proxy ✗ 弱 部分 有限 ✓ | 中等 ✓ ✓ ✗ kube-proxy WireGuard 中 ✓ ✓ ✓ | 中等-复杂 ✓ ✓ ✓ 原生 eBPF WireGuard 强(Hubble) ✓ ✓ 有限 |
4.2 性能对比
性能基准测试(100G 网卡,Pod-to-Pod):
| 测试项 | Flannel (VXLAN) | Calico (BGP) | Cilium (eBPF) |
|---|---|---|---|
| TCP 吞吐 PPS(64B) 延迟(P50) 延迟(P99) TCP 新建/s | 35 Gbps 5 Mpps 75 μs 150 μs 30K | 50 Gbps 8 Mpps 50 μs 100 μs 50K | 48 Gbps 15 Mpps 35 μs 60 μs 200K |
关键结论: 1. Cilium eBPF 的 PPS 是 Calico BGP 的 2x 2. Cilium 延迟最低(绕过了 iptables 和 conntrack) 3. Calico BGP 吞吐最高(无封装开销) 4. Flannel VXLAN 性能最低(封装开销)
4.3 选型建议
选型决策树:
是否需要 NetworkPolicy? ├── 不需要 → Flannel(最简方案) └── 需要 → ├── 是否需要 L7 策略/高性能? │ ├── 是 → Cilium(eBPF) │ └── 否 → │ ├── 内核版本 > 5.10? │ │ ├── 是 → Cilium(推荐) │ │ └── 否 → Calico └──
场景推荐: | 场景 | 推荐方案 | | --- | --- | | 开发/测试 通用生产 高性能计算 金融交易 多租户 边缘/小型 混合云 | Flannel(简单快速) Calico(稳定成熟) Cilium(极致性能) Cilium(低延迟+可观测性) Cilium 或 Calico(策略强) Flannel(资源占用少) Cilium(多集群统一管理) |
五、总结
| 知识点 | 核心要点 |
|---|---|
| Flannel | 简单 CNI,VXLAN/host-gw 模式,无 NetworkPolicy |
| Calico | 完整 CNI,BGP/VXLAN 数据面,iptables 策略 |
| Cilium | 新一代 eBPF CNI,高性能,L7 策略,Hubble 可观测性 |
| 性能排序 | Cilium(eBPF) > Calico(BGP) > Flannel(VXLAN) |
| 功能排序 | Cilium > Calico > Flannel |
| 复杂度排序 | Flannel < Calico < Cilium |
| 选型关键 | 性能需求、策略需求、内核版本、运维能力 |
六、思考
- Flannel 的 host-gw 模式和 VXLAN 模式有什么区别?什么情况下不能使用 host-gw 模式?
- Calico 的 BGP 模式下,Pod 跨节点通信时数据包是否经过隧道封装?为什么 Calico BGP 性能优于 Flannel VXLAN?
- Cilium 使用 eBPF 替代 iptables 带来了哪些性能提升点?为什么 eBPF 的 PPS 比 iptables 高 3-5 倍?
- 在一个 500 节点的生产集群中,需要 NetworkPolicy 支持,内核版本为 5.4,你会选择哪个 CNI?为什么?
- Hubble 在 Cilium 中扮演什么角色?如果网络出现故障,Hubble 如何帮助排查问题?
下篇预告:第277篇《Cilium eBPF 数据面与网络性能》——深入 Cilium 的 eBPF 数据面原理,XDP/TC hook、身份标识、eBPF Map 与高性能网络路径。