eBPF 模式下 CNI 与 kube-proxy 完整关系详解
核心概念 eBPF 程序直接挂载内核网络钩子,一套 eBPF 程序同时接管 CNI 网络 + Service 代理能力,可完全移除 kube-proxy。
1. 基础前置知识
- 传统模式(iptables/ipvs kube-proxy + 标准CNI)
- CNI(Calico/Flannel):只负责Pod IP分配、跨主机Pod互通、NetworkPolicy;
- kube-proxy:独立DaemonSet,在节点维护内核
iptables/ipvs规则,实现 Service 四层负载均衡、ClusterIP/NodePort/LoadBalancer 转发;
两者职责完全隔离,互不干涉,两套独立内核规则。
- eBPF 模式核心变革
eBPF 程序直接挂载 Linux 内核网络钩子(tc、xdp、cgroup sock),一套 eBPF 程序同时接管 CNI 网络 + Service 代理能力,可直接移除 kube-proxy,这是两者关系变化的核心。
主流实现:Cilium CNI(纯eBPF),Calico 也支持 eBPF 代理模式。
2. 两种部署形态下二者关系
2.1. 形态1:标准eBPF CNI(Cilium),完全弃用 kube-proxy(主流生产方案)
2.1.1. 职责融合,CNI 内置替代 kube-proxy 全部能力
Cilium Agent(CNI组件)加载 eBPF 程序到内核,统一承担两套工作:
(1)原有 CNI 本职工作
- Pod 创建/销毁时分配 IPv4/IPv6 地址;
- 维护 Pod 跨主机隧道/路由,打通集群 Pod 通信;
- 实现 NetworkPolicy 网络访问控制(eBPF L3/L4/L7 策略,性能远超 iptables);
- 服务发现、DNS 劫持、流量观测、加密隧道等。
(2)接管原 kube-proxy 的所有 Service 转发逻辑(关键)
eBPF 在内核态实现完整 Service 代理,覆盖所有 Service 类型:
- ClusterIP:Pod 访问服务时内核直接负载均衡到后端 Endpoint Pod;
- NodePort:节点端口流量转发;
- LoadBalancer:对接云厂商LB;
- ExternalIPs、LocalTraffic 本地路由策略;
- SessionAffinity 会话保持、权重分发、本地优先拓扑路由;
2.1.2. 数据流转关系
- Cilium Agent 监听 apiserver:同步 Pod、Service、Endpoint、NetworkPolicy 全量资源;
- 资源变更后,Agent 编译、下发 eBPF 字节码到节点内核;
- 内核 eBPF 程序统一处理两类流量:
- Pod ↔ Pod:CNI 互通 + NetworkPolicy 过滤;
- Pod ↔ Service:四层负载均衡转发(原 kube-proxy 能力);
- 不再部署 kube-proxy DaemonSet,节点无独立代理组件,无 iptables/ipvs 规则膨胀问题。
2.1.3. 二者层级关系
eBPF CNI (Cilium) 是上层管控组件,内核eBPF程序是底层统一网络执行引擎,原 kube-proxy 的功能下沉合并进 CNI 的 eBPF 逻辑,kube-proxy 彻底退场,不存在协作关系。
2.2. 形态2:Calico eBPF 混合模式(保留 kube-proxy,分工共存)
Calico eBPF 提供两种模式:
- 标准eBPF代理模式(无kube-proxy):同Cilium,Calico Agent 内置Service eBPF转发,删除kube-proxy;
- 纯NetworkPolicy eBPF模式(共存):
- Calico eBPF 只负责 Pod 互通、NetworkPolicy;
- kube-proxy 依旧独立部署,用 ipvs/iptables 处理 Service;
此时两者职责分离、并行运行、互不依赖: - CNI:管控Pod网络、访问策略;
- kube-proxy:管控Service四层转发;
内核两套规则独立生效,无功能融合。
3. eBPF 无 kube-proxy 架构核心优势(二者融合带来的变化)
- 消除两套内核规则冲突
传统:CNI iptables 规则 + kube-proxy ipvs/iptables 两套表,规则数万条,匹配链过长,延迟高;
eBPF:单套内核程序,匹配路径短,转发性能大幅提升。 - Endpoint 更新毫秒级生效
kube-proxy 全节点同步iptables规则存在延迟;eBPF map 直接在内核更新后端Pod列表,无用户态同步开销。 - 本地路由拓扑感知(Topology Hints)原生支持
eBPF 内核可直接识别同节点/同可用区后端Pod,优先本地转发,减少跨主机流量,传统kube-proxy ipvs实现复杂。 - L7 能力统一集成
CNI eBPF 可同时做四层转发+七层流量控制(限流、TLS、HTTP过滤),kube-proxy 仅四层,无法扩展。 - 减少集群组件数量
无需维护 kube-proxy DaemonSet,降低运维复杂度、减少节点资源占用。
4. 关键区分:传统 vs eBPF 架构对比
| 维度 | 传统架构 iptables/ipvs + CNI | eBPF CNI(Cilium,移除kube-proxy) |
| Service转发执行者 | kube-proxy(用户态程序,操作内核ipvs/iptables) | CNI Agent下发eBPF,内核直接处理 |
| NetworkPolicy执行者 | CNI iptables | CNI eBPF |
| 组件关系 | 完全独立、两套内核规则 | CNI统一管控,融合两套能力,无kube-proxy |
| 规则存储 | iptables链 / ipvs虚拟服务 | eBPF Map(内核哈希表) |
| 组件数量 | CNI DaemonSet + kube-proxy DaemonSet | 仅一套CNI DaemonSet |
5. 常见面试核心总结
- 纯eBPF Cilium模式(主流)
CNI 基于 eBPF 在内核同时实现「Pod网络互通、NetworkPolicy、Service四层负载均衡」,完全废弃 kube-proxy;CNI Agent 统一监听 apiserver 的 Pod/Service/Endpoint 资源,下发一套 eBPF 程序统一处理所有网络流量,kube-proxy 不再存在,二者无协作关系,CNI 替代了 kube-proxy。 - Calico 共存模式
若仅开启eBPF NetworkPolicy,不开启eBPF Service代理,则 CNI 只负责Pod互通与策略,kube-proxy 保留独立运行,二者职责完全拆分,并行工作、互不依赖。 - 本质关系变化
传统架构:CNI、kube-proxy 是两个独立组件,两套内核网络逻辑;
eBPF 完整代理架构:CNI 升级为统一网络管控平面,通过内核eBPF程序吞并 kube-proxy 的全部Service转发能力,kube-proxy 不再需要部署。
关联文档