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

枫少@KillBoy
枫少@KillBoy
枫少@KillBoy
管理员
267
文章
0
粉丝
云原生安全41833字数 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
评论  41  访客  40  作者  1
    • 金字塔
      金字塔 1

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

      • 迷踪鬼
        迷踪鬼 0

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

        • 深夜独影
          深夜独影 1

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

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

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

            • 墨点江山
              墨点江山 1

              L7 策略直接在内核解析 HTTP,这点很香

              • 露营专家
                露营专家 1

                升级内核到 5.10 以上才能用全功能吧?

                  • 皮卡丘的尾巴
                    皮卡丘的尾巴 1

                    @ 露营专家 想开全功能的话,5.10 起步更省心

                  • 虚无坐标
                    虚无坐标 2

                    以前查 iptables 规则头都大了,eBPF 方便不少

                    • 品茗听雨
                      品茗听雨 1

                      Hubble 看流量拓扑比抓包直观太多了

                      • 发条小蜗牛
                        发条小蜗牛 0

                        迁移前还是得在非生产环境多测几遍

                          • 木纹岁月
                            木纹岁月 1

                            @ 发条小蜗牛 尤其是 DNS 和长连接场景,最容易漏测

                          • 藏锋社交者
                            藏锋社交者 1

                            裸机也能统一纳管策略,跨集群场景正好需要

                            • 小草莓榴弹
                              小草莓榴弹 1

                              几千个节点时性能差异应该很明显

                                • 绣工董
                                  绣工董 1

                                  @ 小草莓榴弹 线性查找和哈希表比起来简直天差地远

                                • 行旅天涯
                                  行旅天涯 1

                                  支持 gRPC 方法控制这点挺实用的

                                  • 幻影方程式
                                    幻影方程式 1

                                    看来是时候把老集群的 CNI 换换了

                                    • 英招巡天
                                      英招巡天 1

                                      Hubble 不用侧边车就能看拓扑,这点太香了

                                      • 虹羽
                                        虹羽 1

                                        迁移前先拿非生产集群试水比较稳妥

                                        • 蘅芜春晓
                                          蘅芜春晓 1

                                          内核版本太低确实得先升级一下

                                            • 孤鸿剑尊
                                              孤鸿剑尊 1

                                              @ 蘅芜春晓 升级内核这块确实是最大的门槛

                                            • 弦上霜
                                              弦上霜 1

                                              Hubble 的拓扑图看故障定位很快

                                                • 月华郡主
                                                  月华郡主 0

                                                  @ 弦上霜 结合策略命中记录看,定位会更快

                                                • FrostveilSeer
                                                  FrostveilSeer 1

                                                  跨集群同步策略对多云部署太关键了

                                                  • 太极真人
                                                    太极真人 1

                                                    直接在内核拦截 L7 请求,真是省了很多代理层。

                                                    • 霜焰之心
                                                      霜焰之心 1

                                                      不用 Sidecar 就能做服务网格真香

                                                        • 穿睡衣的恐龙
                                                          穿睡衣的恐龙 0

                                                          @ 霜焰之心 省去了那么多资源开销,确实舒服

                                                        • 寒烟渺
                                                          寒烟渺 1

                                                          L7 策略要是丢包了,业务端能看出是被策略拦的吗

                                                          • 蜜糖小窝
                                                            蜜糖小窝 1

                                                            规则更新瞬间完成,这效率没谁了

                                                            • 雨后心情
                                                              雨后心情 1

                                                              裸机也能统一管控,边界更清晰了

                                                              • Ghost灵
                                                                Ghost灵 0

                                                                大规模集群还是得试试 eBPF 方案

                                                                • 兰亭
                                                                  兰亭 1

                                                                  L7 策略控制到路径级别太精细了

                                                                  • 老照片角落
                                                                    老照片角落 2

                                                                    之前用 iptables 规则多了真的卡死

                                                                    • 治粟内史
                                                                      治粟内史 1

                                                                      Hubble 实时观察流量的功能很强大

                                                                      • AbyssDreamer
                                                                        AbyssDreamer 1

                                                                        想知道从 Calico 迁移过来的难度大吗

                                                                        • 灵泉吟游
                                                                          灵泉吟游 1

                                                                          内核 4.19 也能跑,但建议还是上 5.10

                                                                          • Lina虹
                                                                            Lina虹 1

                                                                            不需要注入 Sidecar 对开发太友好了

                                                                            • 土豆の梦想
                                                                              土豆の梦想 1

                                                                              这种零侵入的可观测性才是核心竞争力

                                                                              • 赛博吟游者
                                                                                赛博吟游者 1

                                                                                对大规模集群的运维压力能减轻不少

                                                                                • 小皮包
                                                                                  小皮包 0

                                                                                  标签治理跟不上,细策略也容易乱

                                                                                  • 湮灭之翼
                                                                                    湮灭之翼 1

                                                                                    开启 L7 策略会不会增加延迟?

                                                                                      • 枫少@KillBoy
                                                                                        枫少@KillBoy

                                                                                        @ 湮灭之翼 L7 要解析 HTTP 头,比纯 L3/L4 多点开销是肯定的,但都在内核里做完,比 iptables 那种线性匹配还是划算~

                                                                                    匿名

                                                                                    发表评论

                                                                                    匿名网友

                                                                                    拖动滑块以完成验证