4、容器网络模型:Flannel、Calico、Cilium对比
说到容器网络,很多刚接触PaaS平台的朋友都会问我:「到底该选哪个网络插件?」
说实话,这个问题没有标准答案。我这些年参与过十几个Kubernetes集群的搭建,Flannel、Calico、Cilium都用过,踩过的坑也不少。今天我就把这三兄弟掰开揉碎了讲讲,希望能帮你少走弯路。
4.1 先聊聊容器网络的核心问题
在对比之前,我们得先搞清楚容器网络到底要解决什么问题。说白了就三点:
- IP分配:每个Pod都得有个独立的IP,而且不能冲突
- 通信:不同节点上的Pod要能互相访问
- 策略控制:谁可以跟谁通信,得能管得住
这三个问题,Flannel只解决了前两个,Calico和Cilium三个都管。嗯,这就是它们最本质的区别。
4.2 Flannel:简单就是美
Flannel是CoreOS推出的,设计理念就是「简单」。它只做一件事:给每个节点分配一个子网,然后让Pod跨节点通信。
它的工作原理其实很直白:
- 每个节点上的Docker或containerd启动时,会从Flannel分配的子网里拿IP
- Flannel在节点间建立覆盖网络(Overlay),把Pod的流量封装起来传输
Flannel支持几种后端模式,我列个表给你看:
| 后端模式 | 封装方式 | 性能 | 适用场景 |
|---|---|---|---|
| VXLAN | UDP封装 | 中等 | 通用场景,跨网段 |
| host-gw | 无封装,直接路由 | 高 | 同二层网络 |
| UDP | 用户态UDP封装 | 低 | 兼容老旧内核 |
我的建议:如果你集群规模不大(几十个节点),网络环境简单,Flannel的VXLAN模式完全够用。我曾经在一个测试环境里用host-gw模式,性能确实好,但后来节点跨了VLAN,直接翻车了。
4.3 Calico:网络策略的王者
Calico跟Flannel最大的不同,就是它不走覆盖网络。它用的是纯三层路由,说白了就是让每个节点充当路由器,直接转发Pod的流量。
Calico的核心组件包括:
- Felix:运行在每个节点上,负责配置路由和iptables规则
- BIRD:BGP协议的实现,负责在节点间交换路由信息
- Typha:大规模集群时,用来减轻etcd的压力
Calico最让我喜欢的是它的网络策略能力。你可以精确控制:
- 哪个Pod可以访问哪个Service
- 来自哪个命名空间的流量可以进来
- 甚至可以根据标签做细粒度控制
避坑指南:我曾经在一个200节点的集群里用Calico,默认的BGP配置导致路由表爆炸。后来调整了Route Reflector的配置,才稳定下来。记住,大规模集群一定要用Route Reflector,别让所有节点都互相建立BGP连接。
4.4 Cilium:eBPF带来的革命
Cilium是后起之秀,它利用Linux内核的eBPF技术,直接在数据路径上做网络和策略处理。说白了,它绕过了传统的iptables,性能提升非常明显。
Cilium的几个亮点:
- 性能:eBPF在内核态执行,延迟比iptables低一个数量级
- 可观测性:可以拿到每个连接的详细指标,比如延迟、丢包率
- 安全:支持基于身份的安全策略,不只是IP
我记得第一次在测试环境部署Cilium时,跑了个基准测试,结果让我吃了一惊——同样条件下,Cilium的吞吐量比Calico高了将近30%。
注意:Cilium对内核版本有要求,至少需要4.19以上。如果你用的是CentOS 7默认的3.10内核,那基本没戏。我建议至少用5.10以上的内核,才能发挥eBPF的全部能力。
4.5 三者的对比总结
好了,我把三者的关键差异整理成一张表,方便你对比:
| 特性 | Flannel | Calico | Cilium |
|---|---|---|---|
| 网络模型 | Overlay(VXLAN/UDP) | 纯三层路由(BGP) | eBPF原生 |
| 性能 | 中等 | 高 | 极高 |
| 网络策略 | 不支持 | 支持(iptables) | 支持(eBPF) |
| 可观测性 | 弱 | 中等 | 强 |
| 部署复杂度 | 低 | 中 | 中高 |
| 内核要求 | 低 | 中 | 高(4.19+) |
| 适用规模 | 小到中型 | 中到大型 | 中到大型 |
4.6 我该怎么选?
这个问题,我一般会反问对方三个问题:
- 你的集群有多大? 几十个节点,Flannel够用;几百个节点,考虑Calico或Cilium
- 你需要网络策略吗? 不需要的话,Flannel最省心;需要的话,Calico或Cilium
- 你的内核版本够新吗? 够新的话,Cilium是未来趋势;不够新,老老实实Calico
我个人习惯:新项目我基本都上Cilium了。虽然部署时多花点时间,但后续的运维和排障体验好太多了。特别是那个Hubble组件,看网络流量跟看监控一样直观。
最后说一句,没有银弹。Flannel、Calico、Cilium各有各的适用场景。你想想看,如果你的集群就10个节点,跑个内部测试环境,非得上Cilium,那不是杀鸡用牛刀吗?
嗯,今天就聊到这儿。下一章我们讲讲容器存储,那又是一个大坑。