当 Kubernetes 集群规模从几十个 Pod 增长到上千个,传统的 kube-proxy 和 iptables 方案开始暴露瓶颈。每一次 Service 更新都需要遍历并重写整个规则链,节点越多,延迟越明显。更让安全团队头疼的是,iptables 的规则匹配是线性查找,策略数量一多,网络延迟和 CPU 开销都会直线上升。而 eBPF 的出现,正在从根本上改变这种局面——它让网络策略的执行不再依赖用户态的规则引擎,而是直接在内核层面完成数据包的处理和决策。

从 iptables 到 eBPF:网络策略的底层变革
传统 Kubernetes 集群的网络策略依赖 iptables 或 IPVS 实现。iptables 本质上是 Netfilter 框架的一个用户态工具,通过在内核中注册钩子函数来拦截和修改数据包。当集群中的 Service 和 Pod 数量增多时,iptables 规则数量呈线性甚至指数级增长,每次规则变更都需要将整个规则集重新加载到内核,这个过程会引发短暂的连接中断和延迟抖动。对于高密度集群或延迟敏感的业务场景,这种影响往往是不可接受的。
eBPF(扩展伯克利包过滤器)则完全不同。它允许开发者在 linux 内核中安全地运行沙箱化程序,而这些程序可以在数据包到达网络栈的早期阶段就被触发执行。Cilium 正是利用这一特性,将数据包处理逻辑直接编译成 BPF 字节码,并附加到网络接口的流量控制(tc)钩子上。当数据包从容器 veth 对进入主机网络命名空间时,eBPF 程序已经在对应钩子上等待,立即执行 L3/L4 甚至 L7 的策略检查,通过高效的哈希表查找替代 iptables 的线性匹配,从而大幅降低延迟和 CPU 开销。
Cilium 如何重构 K8s 网络与安全策略
Cilium 并不仅仅是一个 CNI 插件,它代表了一种全新的网络架构思路。传统方案如 Calico 虽然也支持 eBPF 模式,但其数据面核心仍然是“路由协议 + 策略引擎”,eBPF 更像是后来添加上去的加速层。Cilium 从设计之初就将 eBPF 作为唯一的数据面,不再依赖 iptables、BIRD 或 kube-proxy,甚至不需要 sidecar 就能实现部分 Service Mesh 功能。
内核级策略执行:超越 Namespace 限制
Kubernetes 原生的 NetworkPolicy 只能作用于 Pod 之间,基于标签选择器做 L3/L4 的允许或拒绝策略。Cilium 通过自定义的 CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy 资源,在保持原生 API 兼容的基础上,扩展了策略的覆盖范围。它支持:
- L7 策略:可以基于 HTTP 方法、路径、Host 头甚至 gRPC 方法进行精细化访问控制。例如,允许某个 Backend 角色的 Pod 向 my-api-server 的 /api 路径发送 GET 请求,但拒绝 POST 请求。这种策略在传统 iptables 方案中几乎无法实现,而在 Cilium 中,eBPF 程序可以在内核中解析 HTTP 协议头,并直接丢弃不符合规则的请求,完全不经过应用层。
- 跨集群策略:通过 ClusterMesh 或 KVStoreMesh 实现多集群间的策略同步,适合大规模多云部署场景。
- 裸机与虚拟机支持:将安全策略扩展到集群外的裸机或虚拟机实例,实现统一的网络边界控制。
零侵入的可观测性
一旦 Cilium 接管了集群网络,所有出入流量都会经过 eBPF 程序。这意味着集群天然获得了深度的网络可观测能力,而无需在 Pod 中注入 Sidecar 或修改应用代码。Hubble 作为 Cilium 的可视化组件,可以采集流经 BPF 程序的网络指标,包括请求延迟、错误码、TCP 重传次数、DNS 查询记录等。安全团队可以通过 Hubble 直接查看实时的服务依赖拓扑图,定位异常流量和性能瓶颈,而不需要再部署额外的抓包工具或服务网格。

与传统安全运维方式的对比
在引入 eBPF 和 Cilium 之前,安全团队在 Kubernetes 环境中的网络策略实施通常面临几个痛点:
- 规则维护成本高:iptables 规则链复杂且脆弱,每次变更都可能引发连锁错误。审计和排查困难,需要逐条核对规则表。
- 性能与安全不可兼得:开启细粒度的网络策略往往会增加数据路径的延迟,很多团队为了性能不得不牺牲部分策略的精细度。
- 可观测性割裂:网络监控、日志采集和策略执行分属不同工具链,数据难以关联。排查一个安全事件往往需要同时查看 Prometheus 指标、Kibana 日志和手动抓包结果。
Cilium 通过统一的 eBPF 数据面,将策略执行、网络转发和可观测性整合到同一个内核路径中。安全策略的变更不再需要保存和重载整个规则集,而是通过更新 BPF 映射表完成,过程几乎是瞬时的。对于大规模集群,这种优势尤其明显。根据实际部署案例,在拥有数千个节点、数十万个 Pod 的集群中,Cilium 的节点延迟和规则更新速度远优于传统 iptables 方案。
落地实践:从传统方案迁移到 Cilium
环境准备
Cilium 对 linux 内核版本有明确要求。最低版本为 4.19,推荐使用 5.10 或更高版本,以支持全部 eBPF 特性。可以通过 uname -r 检查内核版本,如果版本过低,需要先升级内核。集群本身需要基于 Kubernetes 1.16 或更高版本,推荐 1.24 以上。
安装与部署
Cilium 官方推荐使用 Helm 进行安装。安装前需要确保集群中已有的 CNI 插件已被移除,避免冲突。基本安装命令如下:
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system
高级配置可以通过 values 文件调整,例如开启 Hubble 可观测性、启用 L7 策略支持、或配置 kube-proxy 替换模式。启用 kube-proxy 替换后,Cilium 会接管 Service 的负载均衡逻辑,彻底移除 kube-proxy 组件,减少数据路径的跳数。
网络策略示例
部署完成后,可以通过以下 CiliumNetworkPolicy 实现一个简单的 L7 策略:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: api-server-policy
spec:
endpointSelector:
matchLabels:
role: backend
ingress:
- fromEndpoints:
- matchLabels:
role: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/public"
这个策略的作用是:只允许带有 role: frontend 标签的 Pod 通过 HTTP GET 方法访问后端 Pod 的 /api/public 路径。任何其他方法或路径的请求,会被内核中的 eBPF 程序直接丢弃。这种粒度的控制,在传统 iptables 方案中几乎无法实现,但在 Cilium 中只需要一个简单的 YAML 配置文件。
验证与监控
安装 Hubble 组件后,可以通过 hubble observe 命令实时查看集群内的网络流量,确认策略是否生效。Hubble 的输出会显示每一条流量的来源、目标、协议和策略决策结果,是排查策略问题和性能瓶颈的利器。
迁移过程中的注意事项
从传统方案迁移到 Cilium 并非全无风险。建议采用以下步骤:
- 先在非生产集群测试:验证现有应用的网络连接是否正常,特别是跨集群通信、DNS 解析和负载均衡场景。
- 逐步启用高级特性:先使用 L3/L4 策略替换现有 iptables 规则,确认稳定后再逐步开启 L7 策略和 kube-proxy 替换。
- 监控内核版本兼容性:某些旧版本内核可能存在 eBPF 特性支持不全的问题,升级前应核对 Cilium 的兼容性矩阵。
- 保留回退方案:在迁移期间保留旧 CNI 插件的配置备份,确保出现兼容性问题时可以快速回滚。
总结
eBPF 技术的成熟,正在让 Kubernetes 的网络和安全策略从“勉强可用”走向“高效且精细”。Cilium 作为这一方向上的代表性项目,通过在内核中直接运行数据面程序,实现了比传统 iptables 方案更低的延迟、更高的吞吐量和更丰富的策略控制能力。对于正在管理中等规模及以上集群的安全团队来说,从 iptables 迁移到 Cilium 已经不是“要不要”的问题,而是“什么时候做”的问题。尽早熟悉这套技术栈,将为后续的云原生安全建设打下坚实的基础。

重庆市 1F
Cilium 替换 kube-proxy 后延迟确实低很多
山东省烟台市 2F
回滚预案要提前演练,不然真出问题会手忙脚乱
甘肃省 3F
替换 kube-proxy 后,原有运维脚本也得检查
山东省烟台市 4F
L7 规则别一次铺太开,维护量也不小
重庆市 5F
L7 策略直接在内核解析 HTTP,这点很香
重庆市 6F
升级内核到 5.10 以上才能用全功能吧?
广东省深圳市 B1
@ 露营专家 想开全功能的话,5.10 起步更省心
甘肃省 7F
以前查 iptables 规则头都大了,eBPF 方便不少
山东省烟台市 8F
Hubble 看流量拓扑比抓包直观太多了
上海市青浦区 9F
迁移前还是得在非生产环境多测几遍
重庆市 B1
@ 发条小蜗牛 尤其是 DNS 和长连接场景,最容易漏测
山东省烟台市 10F
裸机也能统一纳管策略,跨集群场景正好需要
甘肃省 11F
几千个节点时性能差异应该很明显
广东省深圳市 B1
@ 小草莓榴弹 线性查找和哈希表比起来简直天差地远
广东省深圳市 12F
支持 gRPC 方法控制这点挺实用的
上海市崇明县 13F
看来是时候把老集群的 CNI 换换了
安徽省滁州市 14F
Hubble 不用侧边车就能看拓扑,这点太香了
上海市松江区 15F
迁移前先拿非生产集群试水比较稳妥
重庆市 16F
内核版本太低确实得先升级一下
广东省深圳市 B1
@ 蘅芜春晓 升级内核这块确实是最大的门槛
广东省深圳市 17F
Hubble 的拓扑图看故障定位很快
甘肃省 B1
@ 弦上霜 结合策略命中记录看,定位会更快
上海市青浦区 18F
跨集群同步策略对多云部署太关键了
福建省漳州市 19F
直接在内核拦截 L7 请求,真是省了很多代理层。
甘肃省 20F
不用 Sidecar 就能做服务网格真香
上海市嘉定区 B1
@ 霜焰之心 省去了那么多资源开销,确实舒服
巴基斯坦 21F
L7 策略要是丢包了,业务端能看出是被策略拦的吗
广东省深圳市 22F
规则更新瞬间完成,这效率没谁了
甘肃省 23F
裸机也能统一管控,边界更清晰了
甘肃省 24F
大规模集群还是得试试 eBPF 方案
山东省烟台市 25F
L7 策略控制到路径级别太精细了
甘肃省 26F
之前用 iptables 规则多了真的卡死
山东省烟台市 27F
Hubble 实时观察流量的功能很强大
重庆市 28F
想知道从 Calico 迁移过来的难度大吗
上海市普陀区 29F
内核 4.19 也能跑,但建议还是上 5.10
上海市南汇区 30F
不需要注入 Sidecar 对开发太友好了
重庆市 31F
这种零侵入的可观测性才是核心竞争力
甘肃省 32F
对大规模集群的运维压力能减轻不少
甘肃省 33F
标签治理跟不上,细策略也容易乱
重庆市 34F
开启 L7 策略会不会增加延迟?
宁夏银川市 B1
@ 湮灭之翼 L7 要解析 HTTP 头,比纯 L3/L4 多点开销是肯定的,但都在内核里做完,比 iptables 那种线性匹配还是划算~