云原生网络 · CNCF 毕业项目 · Apache-2.0

第 145 期 · 把 kube-proxy 换成 eBPF:Cilium 重写 Kubernetes 网络数据面

如果你的 Kubernetes 集群还在用 iptables 模式的 kube-proxy,服务一多,规则就会线性膨胀,每次新建连接都要扫一遍链。Cilium 的判断很直接:把这些逻辑搬进 Linux 内核,用 eBPF 在数据路径上当场做转发和策略。它能不能真正落地,第一道坎不是你会不会用,而是你的内核够不够新。

一、Cilium 是做什么的

Cilium 是一个基于 eBPF 的网络、安全与可观测项目,作为 CNI 插件为 Kubernetes 提供三层能力:

  • 网络与策略:用「基于身份」的 L3–L7 网络策略替代传统「基于 IP」的规则,安全模型与地址解耦;
  • 负载均衡:用 eBPF 哈希表做分布式负载均衡,可以完整替换 kube-proxy;
  • 可观测:自带 Hubble,从同一条 eBPF 路径上吐出结构化流日志(源/目的身份、verdict、延迟、HTTP 状态、DNS);
  • 进阶:无 sidecar 的服务网格、多集群互联(ClusterMesh)、节点间 WireGuard / IPsec 加密、BGP 对等。

它的底层是一个叫 eBPF 的 Linux 内核技术:把字节码动态挂到网络 IO、socket、tracepoint 等内核挂载点,安全地实现网络与安全逻辑,无需改动内核源码。

二、怎么装、怎么用

前置条件(官方系统要求):宿主机架构为 AMD64 或 AArch64;Linux 内核 >= 5.10(RHEL 8.10 上 >= 4.18 也可);脱离 K8s 单独运行时还需 etcd >= 3.1.0,原生进程模式还需 clang+LLVM >= 18.1。

推荐用 Helm 装到 kube-system(官方示例版本):

helm install cilium cilium/cilium --version 1.19.4 --namespace kube-system

或用 Cilium CLI 一行拉起并自检:

cilium install
cilium status

想开 Hubble 可观测(官方示例,开启 relay 与 UI):

helm install cilium cilium/cilium --version 1.19.4 --namespace kube-system --set hubble.relay.enabled=true --set hubble.ui.enabled=true

三、优点

  • 内核级 eBPF 数据面,省掉用户态代理开销,转发按身份而非 IP;
  • 完整替换 kube-proxy,告别 iptables 规则爆炸;
  • Hubble 流日志与策略 verdict 同源,排障不用 tcpdump 考古;
  • CNCF 毕业项目,社区与长期维护性稳;
  • 无 sidecar 服务网格、多集群互联、加密、BGP 一把梭。

四、坑与风险点(动手前必须知道)

风险点说明
内核门槛要求 >= 5.10(RHEL 8.10 上 >= 4.18),老 LTS 或混版本集群会让部分节点加载不了 eBPF 程序、数据面行为不一致。
运维心智负担排障要走 bpftool、cilium monitor、Hubble,不能 strace BPF;需要一定的 Linux 网络底子。
连接跟踪表内存CT map 按节点常驻内核内存,连接风暴下会写满并丢弃/失败新连接,需手动调 bpf-ct-global-tcp-max。
迁移非 trivial从 iptables 类 CNI 切过来要逐节点灰度,不能一把梭。
单节点单数据面内核崩溃或 verifier bug 会一次性带走本节点所有 Pod,不是 sidecar 那种一个一个挂。
权限与内核模块节点 agent 需要 CAP_BPF / CAP_SYS_ADMIN;L7 策略依赖 xt_socket 内核模块,缺模块的内核走降级路径、损失部分性能。
大集群内存eBPF map 随集群规模与策略复杂度增长,万级 Pod 时可能吃掉数 GB 内核内存,要调 bpf.mapMaxSize 等。

五、最终效果:适合谁、不适合谁

适合:自托管 Kubernetes、能控制内核升级与节点 agent 的团队;需要内核级 L3–L7 策略、高包速率、深度数据面可观测的负载;想用无 sidecar 服务网格或多集群互联的。

不适合:节点内核 < 5.10 或无法升级;禁止加载 eBPF / 跑特权 agent 的强受限托管环境;团队没有 Linux 网络经验、只想用最简单 CNI;小集群、网络需求简单。


动手前先确认内核 >= 5.10、确认 CONFIG_BPF / CONFIG_BPF_JIT 等内核选项已开;先在 staging 用 cilium status 跑通再灰度到生产;CT map 与 eBPF map 内存按规模预留。

下期预告:eBPF 数据面三选一——Cilium 与 Calico、kube-router 的取舍,以及什么时候其实 iptables 就够了。