3. CNI插件选型与性能特征

在Kubernetes集群中,CNI插件决定了Pod之间、Pod与Service之间、Pod与外部网络之间的数据包如何被转发。不同CNI的转发模式差异,会直接体现在吞吐量、延迟、CPU占用、连接建立速度以及可观测性上。选型时如果只看“功能列表”,很容易忽略转发路径带来的性能差异。本节从转发模式出发,对比Calico、Cilium、Flannel、Antrea四类主流CNI,并给出可操作的判断依据。

一、先理解转发模式的三个维度

CNI的性能特征主要由三个维度决定:数据面封装方式、转发规则实现、是否绕过内核协议栈。

  • Overlay与Underlay:Overlay通过VXLAN、IP-in-IP、Geneve等隧道封装,把Pod网络包再包一层,跨节点通信依赖隧道解封装。Underlay则让Pod IP直接参与底层路由,通常配合BGP发布路由,没有额外封装头。Overlay部署简单、对底层网络要求低,但封装/解封装会带来额外CPU开销和约50~100字节的头部开销,MTU需要相应调小。
  • iptables、IPVS与eBPF:Service转发和网络策略的实现方式。iptables规则随Service数量线性增长,大规模集群下规则匹配变慢;IPVS使用哈希表,转发性能更稳定;eBPF在套接字层或TC层直接处理,可绕过部分netfilter路径,延迟和CPU占用通常更优。
  • 内核协议栈与旁路:传统CNI依赖内核netfilter和路由子系统;Cilium的eBPF可以做到同节点Pod间通信在socket层直接转发,减少协议栈穿越次数。

二、四类CNI的转发模式对比

下面这张图把四类CNI的典型转发路径并列展示,便于直观看出封装、规则引擎和旁路能力的差异。

四类主流CNI转发路径与性能特征对比 Calico BGP / IP-in-IP / VXLAN iptables 或 eBPF 数据面 Pod veth → 主机路由 BGP 发布 / 隧道封装 iptables 规则匹配 目标节点解封装 Underlay可选,无封装 大规模下iptables规则膨胀 eBPF模式可缓解 性能特征 吞吐高、延迟低(无封装时) Cilium eBPF 原生数据面 VXLAN / Geneve / Native Routing Pod veth → TC eBPF socket 层直接转发 eBPF Service 负载均衡 可选隧道或直连路由 绕过 netfilter 大部分路径 同节点通信可 socket 旁路 Hubble 提供流级可观测性 性能特征 延迟最低、CPU效率高 Flannel VXLAN / host-gw 纯 iptables 数据面 Pod veth → 主机路由 VXLAN 封装 / host-gw iptables Service 转发 目标节点解封装 部署最简单,依赖少 无网络策略原生支持 VXLAN 封装带来额外开销 性能特征 中等,host-gw 模式较好 Antrea OVS + eBPF 可选 Open vSwitch 数据面 Pod veth → OVS OVS 流表匹配 VXLAN / Geneve 隧道 eBPF 加速可选 网络策略与可观测性完善 OVS 流表可编程 eBPF 模式性能接近 Cilium 性能特征 OVS 模式中等,eBPF 模式优

三、转发模式如何影响性能

把上图的路径拆开看,性能损耗主要发生在四个位置:

  1. 封装与解封装:VXLAN/IP-in-IP 每包增加 50~100 字节头部,MTU 从 1500 降到 1450 或更低。若未正确设置 Pod MTU,会出现大包分片,吞吐下降、重传增加。Calico 的 IP-in-IP 和 Flannel 的 VXLAN 都有此问题;Calico 的 BGP 直连模式、Cilium 的 Native Routing 可避免。
  2. 规则匹配:iptables 的 Service 规则随 Service/Endpoint 数量增长,kube-proxy 在数千 Service 规模下同步延迟可达秒级,且每个包要顺序遍历链。IPVS 用哈希查找,O(1) 复杂度,适合大规模 Service。Cilium 的 eBPF 在 socket 层完成 DNAT,同节点访问 Service 甚至不经过网络栈。
  3. 协议栈穿越次数:传统路径 Pod→veth→netfilter→路由→veth→Pod,同节点通信也要走完整协议栈。Cilium 的 socket-level redirect 可让同节点 Pod 直接内存拷贝,延迟可降低约 30%~50%(具体取决于内核版本与负载特征)。
  4. CPU 缓存与中断:eBPF 程序在 TC 层执行,避免频繁的软中断和上下文切换;OVS 流表在用户态和内核态之间切换,开销相对较高。

四、选型判断:从场景反推模式

没有“最好”的 CNI,只有与场景匹配的转发模式。可以按以下顺序判断:

场景特征优先考虑理由
集群规模小、追求部署简单Flannel VXLAN依赖少、配置简单,性能可接受
需要 BGP 对接物理网络、无封装Calico BGPUnderlay 直连,吞吐和延迟接近裸机
Service 数量多、延迟敏感Cilium eBPF绕过 iptables,socket 层转发
需要细粒度网络策略与流日志Cilium 或 AntreaeBPF/OVS 提供策略与可观测性
已有 OVS 运维体系Antrea复用 OVS 流表与工具链
Windows 节点混合集群Calico 或 Antrea对 Windows 数据面支持较成熟

五、实操验证:用 iperf3 与 netperf 观察差异

选型不能只靠文档,建议在测试集群用以下方式量化对比。以下命令为示例,参数需根据实际节点网卡和 MTU 调整。

# 在服务端 Pod 启动 iperf3
kubectl run iperf-server --image=networkstatic/iperf3 -- -s

# 在客户端 Pod 发起测试,观察吞吐
kubectl run iperf-client --rm -it --image=networkstatic/iperf3 \
  -- -c iperf-server -t 30 -P 4

# 查看 Pod MTU,确认是否因封装导致分片
kubectl exec iperf-client -- ip link show eth0

# 观察 Service 转发路径(Cilium 可用 Hubble)
hubble observe --pod iperf-client --follow

判断依据:若 TCP 吞吐明显低于网卡线速且伴随重传,优先检查 MTU 与封装;若 P99 延迟随 Service 数量增长而上升,检查 iptables 规则规模或切换到 IPVS/eBPF;若同节点 Pod 通信延迟异常高,检查是否走了隧道而非本地转发。

提示:切换 CNI 前,先用测试集群验证目标模式下的 MTU、Service 规模、网络策略和可观测性是否满足要求。生产集群更换 CNI 通常需要重建节点网络,风险较高。
注意:Overlay 模式下若 Pod MTU 未按封装开销调小,会出现“小包正常、大包超时”的典型故障。VXLAN 建议 Pod MTU 设为 1450,IP-in-IP 设为 1480,具体以底层网络 MTU 为准。

总结来看,Calico 适合需要 Underlay 和 BGP 的场景,Cilium 在延迟和可观测性上优势明显,Flannel 胜在简单,Antrea 则在 OVS 生态和策略能力之间取得平衡。选型时应先明确转发模式,再用测试数据验证,而不是仅凭功能列表做决定。