云原生安全:eBPF 在 Kubernetes 网络策略中的零侵入实践

枫少@KillBoy
枫少@KillBoy
枫少@KillBoy
管理员
256
文章
0
粉丝
云原生安全419字数 2242阅读7分28秒阅读模式
AI智能摘要
AI 生成的文章内容摘要

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

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 直接查看实时的服务依赖拓扑图,定位异常流量和性能瓶颈,而不需要再部署额外的抓包工具或服务网格。

Cilium 与 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 并非全无风险。建议采用以下步骤:

  1. 先在非生产集群测试:验证现有应用的网络连接是否正常,特别是跨集群通信、DNS 解析和负载均衡场景。
  2. 逐步启用高级特性:先使用 L3/L4 策略替换现有 iptables 规则,确认稳定后再逐步开启 L7 策略和 kube-proxy 替换。
  3. 监控内核版本兼容性:某些旧版本内核可能存在 eBPF 特性支持不全的问题,升级前应核对 Cilium 的兼容性矩阵。
  4. 保留回退方案:在迁移期间保留旧 CNI 插件的配置备份,确保出现兼容性问题时可以快速回滚。

总结

eBPF 技术的成熟,正在让 Kubernetes 的网络和安全策略从“勉强可用”走向“高效且精细”。Cilium 作为这一方向上的代表性项目,通过在内核中直接运行数据面程序,实现了比传统 iptables 方案更低的延迟、更高的吞吐量和更丰富的策略控制能力。对于正在管理中等规模及以上集群的安全团队来说,从 iptables 迁移到 Cilium 已经不是“要不要”的问题,而是“什么时候做”的问题。尽早熟悉这套技术栈,将为后续的云原生安全建设打下坚实的基础。

 
枫少@KillBoy
评论  4  访客  4
    • 金字塔
      金字塔 1

      Cilium 替换 kube-proxy 后延迟确实低很多

      • 迷踪鬼
        迷踪鬼 0

        回滚预案要提前演练,不然真出问题会手忙脚乱

        • 深夜独影
          深夜独影 1

          替换 kube-proxy 后,原有运维脚本也得检查

          • 像素造梦师
            像素造梦师 1

            L7 规则别一次铺太开,维护量也不小

          匿名

          发表评论

          匿名网友

          拖动滑块以完成验证