乐于分享
好东西不私藏

K8s 网络插件怎么选:Flannel、Calico、Cilium、Kube-OVN

K8s 网络插件怎么选:Flannel、Calico、Cilium、Kube-OVN

给客户做私有化部署集群方案时,经常会有人问:

你们用的什么网络插件?为什么不用 Cilium?

问这话的,多半是客户或团队里比较懂行的人,语气里有时还带着一点「你们是不是技术栈偏旧」的意味。

这个问题很难用一句话回答。CNI 选型这件事,和「哪个更先进」关系不大,和「你的环境允许你用什么」关系很大。同一套业务,装到自建机房、银行信创环境、或者客户自己复制出来的几台虚拟机上,答案可能完全不一样。

下面把几个主流插件过一遍。重点不是参数表——那种网上一搜一大把——而是每个方案在什么条件下会咬人。


先说清楚 CNI 管哪一段

K8s 自己不实现网络,只规定了几条底线:

  • 每个 Pod 有独立 IP
  • Pod 之间可以直接通信,不需要 NAT
  • Pod 和 Node 之间可以直接通信

具体怎么实现,交给 CNI。插件通常要做这些事:

  1. 给 Pod 分 IP(IPAM)
  2. 打通跨节点 Pod 通信(差异最大的地方)
  3. 实现 NetworkPolicy(可选,不是人人都做)
  4. 有的还会顺手接管 Service 转发、加密、可观测性

第 2 条是所有分歧的源头。跨节点通信本质上就两条路:

封装(Overlay)把 Pod 的包塞进另一个包里,从物理网卡发出去,对端拆开。VXLAN、IPIP、Geneve 都是这路。好处是不太挑底层网络;坏处是有封装开销,抓包排障要多剥一层。

路由(Underlay / 直接路由)不封装,让物理网络知道「这个 Pod 网段在哪台机器」。靠 BGP 或静态路由。性能好,但底层网络得配合。

记住这个二分法,后面看插件就清楚多了。


Flannel:够用,而且经常被低估

怎么干活

默认 VXLAN。每个节点起一个 flannel.1 当 VTEP,跨节点流量封装成 UDP 8472 发出去。路由表大概长这样:

ip route
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.110.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink

本节点网段走 cni0,别的节点网段丢给 flannel.1。逻辑简单到几乎不用解释。

好在哪

  • 一个 YAML 就能装,配置项很少
  • 出问题用 ip routebridge fdbtcpdump 基本能定位
  • 对内核版本要求低,老系统也能跑
  • 资源占用小

k3s 默认还带着 Flannel,这个选择本身说明问题。

坑在哪

不支持 NetworkPolicy。装了 Flannel 的集群,你写的 NetworkPolicy 对象能创建、能进 etcd,然后完全不生效——不报错,也不拦截。等安全审计才发现隔离压根没起作用。这个坑很多人踩过。

VXLAN 的 MTU。封装大约占 50 字节,flannel.1 的 MTU 一般是 1450 而不是 1500。底层 MTU 再叠一层隧道时,容易出现「小包通、大包卡死」:ping 通,小接口正常,一传文件就 hang。

ping <对端节点IP> -M do -s 1472

-M do 禁止分片,1472 + 头刚好 1500。通了说明物理链路 MTU 没问题。

规模上去之后偏吃力。节点多了,转发表和封装开销会上来;也几乎没什么可观测能力,出问题只能自己抓包。

真实踩过的坑

有个环境五台虚拟机都是同一模板克隆的,结果所有节点 flannel.1 的 MAC 一模一样,VXLAN 转发表彻底乱掉:同节点通,跨节点全不通。

kubectl get node -o yaml | egrep -i vtep
flannel.alpha.coreos.com/backend-data: '{”VNI”:1,”VtepMAC”:”46:8a:1f:c3:7e:2b”}'flannel.alpha.coreos.com/backend-data: '{”VNI”:1,”VtepMAC”:”46:8a:1f:c3:7e:2b”}'flannel.alpha.coreos.com/backend-data: '{”VNI”:1,”VtepMAC”:”46:8a:1f:c3:7e:2b”}'

根因是 /etc/machine-id 相同,systemd 按它生成虚拟网卡 MAC。严格说不完全是 Flannel 的锅,但它确实说明:Overlay 方案对底层一致性很敏感。

什么时候选

小规模、内部环境、不需要网络策略、没有专职网络同学。或者要装到各种不可预期的客户机器上,需要一个「破机器也能跑起来」的方案。


Calico:企业环境里最稳的那个

怎么干活

模式比较多:

  • BGP(无封装):节点跑 BIRD,把 Pod 网段通告出去,性能最好
  • IPIP:跨子网封装,同子网直连,折中方案
  • VXLAN:底层不支持 BGP 时用,和 Flannel 思路接近

数据平面也有两套:传统 iptables/ipvs,以及后来的 eBPF。

好在哪

NetworkPolicy 扎实。除了标准 NetworkPolicy,还有 GlobalNetworkPolicy、NetworkSet,能做集群级策略、优先级。等保、多租户隔离时,这块经常是刚需。

成熟。项目跑很多年,生产案例多,排障时大多能搜到别人踩过的记录。对交付团队来说,这一点价值经常被低估——现场能不能搜到答案,直接决定当晚能不能收工。

Windows 节点。集群里有 Windows Worker 时,基本就它。

排障工具熟。iptables 模式下,iptables-save、ipset、calicoctl 都是老面孔,不用另学一套调试范式。

坑在哪

BGP 对底层网络要求高。要么节点二层可达做 full mesh,要么和交换机建 BGP 邻居——后者意味着要动客户网络组的交换机。私有化场景里,这句话经常等于「黄了」。现实里很多 Calico 最后退回 IPIP / VXLAN,性能优势也就没了。

iptables 规则膨胀。规模大、策略多时,规则数量和变更收敛时间会很难看。这也是它后来补 eBPF 数据平面的原因。

配置项多。灵活的另一面是要懂的东西多:IPPool、BGPPeer、CrossSubnet、和现有网段怎么不冲突,都得想清楚。

什么时候选

生产集群、要网络策略、要多租户隔离、有合规要求。网络部门肯配合且能跑 BGP 时,性价比很高。有 Windows 节点就直接它。


Cilium:技术上很强,但有门槛

怎么干活

基于 eBPF,把网络逻辑挂到内核 hook 上,不走传统 iptables 链。也可以完整替代 kube-proxy,Service 转发一并接管。

好在哪

性能。绕开 iptables 后,Service 数量上去对转发影响小得多。iptables 是线性匹配;eBPF 更像哈希查找。

L7 策略。可以写「只允许 GET /api/v1/users」这种粒度,也可以按 DNS 做出口过滤。安全要求高时很值钱。

Hubble。传统方案里跨节点不通,常常只能逐台 tcpdump;Hubble 能把服务间调用和 drop 点摊开看。排障效率不是一个量级。

生态在往上走。托管 K8s 和新建生产集群里,选 Cilium 的比例这几年涨得明显。

坑在哪

内核版本是硬门槛。当前稳定版要求内核≥ 5.10(或 RHEL 8.10 一类带足量回移植的 4.18)。社区还在讨论后续抬到 6.1 等价内核,选型时按「能长期跟上」来评估更稳妥。

uname -r

私有化交付里,这一条经常直接筛掉一批环境:

  • CentOS 7(3.10)——出局
  • Ubuntu 20.04(默认 5.4)——通常不够
  • Ubuntu 22.04(5.15)——可以
  • 部分麒麟版本——别想当然,单独确认

不是不能升内核,但客户生产里推一次全节点内核升级,审批和回归往往比换 CNI 还麻烦。

排障范式变了。出问题后 iptables-save 常常什么都看不到,因为规则不在那儿。要会:

kubectl -n kube-system exec ds/cilium -- cilium status --verbosekubectl -n kube-system exec ds/cilium -- cilium monitor --type drop

工具很强,但团队得有人真会用。故障夜里现学,成本很高。

资源占用相对高。小规格节点上要留意。

什么时候选

内核够、团队接得住、对性能和可观测性有真实需求,或者 Service 很多、要做 L7 策略。自己完全掌控的新集群,Cilium 经常是目前最优解之一。

反过来,节点内核都控不住——比如装到客户机器上——就要慎重。


Kube-OVN:多租户和信创场景更对口

怎么干活

底层是 OVN + OVS,把 SDN 能力搬进 K8s。这套东西在 OpenStack 时代就跑了很多年。

好在哪

真正的 VPC 多租户。别的插件做隔离多半靠 NetworkPolicy,本质是一张大网里做访问控制;Kube-OVN 可以给租户独立逻辑路由器,不同 VPC 的 IP 段还能重叠。做多租户平台时,这经常是刚需。

固定 IP、EIP、NAT、QoS、ACL、流量镜像。传统应用上容器时,最常听到的一句是「防火墙按 IP 配的,Pod IP 不能飘」。别的方案要绕,Kube-OVN 原生支持。

Underlay 灵活。Pod 可以直接用物理网 IP,和存量虚拟机同二层,对接老系统方便。

KubeVirt 友好。集群里既跑容器又跑虚拟机时,网络模型更接近传统 IaaS。

国内信创落地案例多。鲲鹏、海光、麒麟这类适配,政企评审时经常是加分项。

坑在哪

运维复杂度最高。要懂逻辑交换机、逻辑路由器、Port Binding、南北向库。排障看的是:

kubectl ko nbctl showkubectl ko vsctl  show

和日常 K8s 工具链是两个世界。

组件多。ovn-central、ovs-ovn、controller、cni,任何一个挂了都要能定位。

社区体量不如前几个。冷门问题资料少,有时得自己啃代码或去社区问。

什么时候选

要 VPC 级隔离、IP 重叠、固定 IP、KubeVirt、信创或金融合规。如果只是「让 Pod 能互通」,用它属于杀鸡用牛刀,运维成本收不回来。


已经不太值得新上的

Weave Net曾经很流行,一行命令还能带加密。Weaveworks 关了,仓库也归档了,很多工具链已移除支持。存量可以排迁移,新项目别选

CanalFlannel 负责连通 + Calico 负责策略。当年是给 Flannel 补 NetworkPolicy。现在直接用 Calico 通常更干净,没必要维护两套。


横向对比

Flannel
Calico
Cilium
Kube-OVN
主要模式
VXLAN / host-gw
BGP / IPIP / VXLAN
eBPF(Overlay/直连)
Geneve / Underlay
NetworkPolicy
不支持
L3-L4,能力强
L3-L7
OVN ACL
多租户 VPC
靠策略隔离
靠策略隔离
支持 IP 重叠
固定 IP
有限
有限
原生
可观测性
很弱
一般
Hubble 最强
流量镜像 + 指标
内核要求
高(≥5.10 或等价)
中等
上手难度
最高
排障工具
ip / tcpdump
iptables / calicoctl
cilium / hubble
ovn / ovs
Windows
有支持
适合规模
中小
中大
任意
中大

性能这一列故意不写死数字。网上 benchmark 换个包长、并发模型,结论就能翻。真在意性能,拿自己的业务流量压一遍更靠谱。

定性排序大致是:

无封装直连(Calico BGP / Cilium 直连)> eBPF Overlay > 传统 VXLAN Overlay

小规模下差距常常感知不到。


选型:先问自己五个问题

比起死盯表格,更建议按这个顺序筛。

1. 节点内核多少,能不能改?

uname -rcat /etc/os-release

低于 5.10 且不能升级 → Cilium 先出局。这是硬约束。见过方案都评审完了,才发现客户是 CentOS 7,整套推倒重来。

2. 要不要 NetworkPolicy?

要 → Flannel 出局。别太轻易答「暂时不要」。等保、审计、多团队共集群,这些需求经常后出现,那时换 CNI 已经很贵。

3. 底层网络能不能配合?

  • 能配 BGP、网络组肯配合 → Calico BGP
  • 动不了物理网 → Overlay
  • Pod 要直连物理网、和虚拟机同网段 → 看 Kube-OVN Underlay

4. 有没有多租户或固定 IP?

IP 段要重叠、要 VPC 隔离、要固定 IP → Kube-OVN 基本是答案。

5. 团队夜里接不接得住?

半夜服务不通,值班得在半小时内判断是不是网络问题。没人懂 eBPF,Cilium 再强也帮不上忙,反而因为「看不懂」拖长恢复。

能力匹配比技术先进重要。听着保守,做过几个项目后多半会认。


几个常见场景怎么选

实验室 / 演示 / 小集群Flannel。快、稳、少折腾。

一般生产,要策略隔离,没有 WindowsCalico(跑不了 BGP 就 IPIP/VXLAN)或 Cilium(内核够、团队熟)。

有 Windows WorkerCalico。

Service 极多、要 Hubble / L7 策略、内核够新Cilium。

多租户平台、固定 IP、信创、KubeVirtKube-OVN。

私有化交付、客户环境不可控优先确定性:Overlay + 成熟方案。很多团队默认 Flannel 或 Calico VXLAN/IPIP,不是不知道 Cilium 好,是内核版本都保证不了时,简单比先进更值钱


最后提醒:换 CNI 不是改个配置

很多人低估迁移成本。

在跑着的集群上换 CNI,基本等于一次网络大手术。Pod IP 段、路由、iptables/eBPF 规则都要变,两套 CNI 也很难安全并存。常见操作是:

  1. drain 节点
  2. 卸旧 CNI,清残留网卡和规则(cni0flannel.1tunl0 不删干净,新 CNI 很容易打架)
  3. 装新 CNI
  4. 重建 Pod

期间业务会中断。Kubespray 一类工具明确不支持 CNI 迁移,就是因为这事自动化不到足够安全。

所以:CNI 是建集群时就要想清楚的决定,不是边跑边调的参数。新建时多花两天选型,比一年后停机迁移划算。


收个口

  • Flannel:简单可靠,不要策略时够用,交付兜底常见选项
  • Calico:企业生产稳妥答案,策略强,有 Windows 就它
  • Cilium:性能和可观测突出,前提是内核够、团队接得住
  • Kube-OVN:多租户、固定 IP、信创、KubeVirt 的专用解

没有「最好的」那个。先卡内核和底层网络两条硬约束,再看策略和多租户,最后看团队能力。三层筛下来,答案通常就剩一个。

各插件版本门槛和特性还在变,落地前以官方文档为准——尤其是 Cilium 的内核要求,后面大概率还会继续抬。


觉得有用就关注一下,后面继续分享 K8s / 运维实操和踩坑记录。

有问题欢迎留言。