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 我该怎么选?

这个问题,我一般会反问对方三个问题:

  1. 你的集群有多大? 几十个节点,Flannel够用;几百个节点,考虑Calico或Cilium
  2. 你需要网络策略吗? 不需要的话,Flannel最省心;需要的话,Calico或Cilium
  3. 你的内核版本够新吗? 够新的话,Cilium是未来趋势;不够新,老老实实Calico

我个人习惯:新项目我基本都上Cilium了。虽然部署时多花点时间,但后续的运维和排障体验好太多了。特别是那个Hubble组件,看网络流量跟看监控一样直观。

最后说一句,没有银弹。Flannel、Calico、Cilium各有各的适用场景。你想想看,如果你的集群就10个节点,跑个内部测试环境,非得上Cilium,那不是杀鸡用牛刀吗?

嗯,今天就聊到这儿。下一章我们讲讲容器存储,那又是一个大坑。