4. Cilium L7 HTTP 策略:HTTP 方法、路径、Header 匹配规则与基于 Kubernetes Ingress 的流量控制

Cilium 的 L7 HTTP 策略允许运维人员基于应用层协议(HTTP/HTTPS)对容器间通信进行细粒度控制。与传统的网络层(L3/L4)策略相比,L7 策略能够识别并过滤具体的 HTTP 请求内容,如方法、路径、头部信息,从而构建更安全的零信任网络模型。本章将深入解析 HTTP 策略的匹配规则,并阐述其与 Kubernetes Ingress 的协同工作方式。

4.1 HTTP 策略核心匹配规则

Cilium 使用 HTTPRule 结构体定义 L7 策略,支持对 HTTP 方法、请求路径 和 Header 进行精确或通配符匹配。策略通常应用于 CiliumNetworkPolicy 或 CiliumClusterwideNetworkPolicy 的 http 字段下。

4.1.1 匹配规则参数对比

匹配维度 字段名 匹配模式 示例 说明
HTTP 方法 method 精确匹配 GET, POST, DELETE 仅允许指定的 HTTP 动词,不区分大小写。
请求路径 path 前缀 / 精确 / 正则 /api/v1/, /healthz, .*\.php 默认前缀匹配;支持 regex: 前缀启用正则。
请求 Header headers 精确匹配(键值对) X-Forwarded-For: 10.0.0.0/8 支持 Value 字段使用 CIDR 或通配符。

4.1.2 策略示例:限制 API 访问

以下策略仅允许 frontend 命名空间中的 Pod 以 GET 方法访问 /api/v1/ 路径,且必须携带特定的认证 Header。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: l7-http-api-restrict
  namespace: backend
spec:
  endpointSelector:
    matchLabels:
      app: api-server
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: "GET"
          path: "/api/v1/"
          headers:
          - "X-Auth-: secret-*"
运维提示: 路径匹配默认使用前缀匹配。若需使用正则表达式,请在路径前添加 regex: 前缀,例如 path: "regex:^/api/v[0-9]/.*"。正则匹配会带来额外的性能开销,建议在压测阶段评估其对吞吐量的影响。

4.2 基于 Kubernetes Ingress 的流量控制

Cilium 可以与 Kubernetes Ingress 控制器(如 Ingress Nginx、Contour)深度集成,将 L7 策略的执行点从 Sidecar 或节点代理下沉到 eBPF 层面。这种模式称为 Cilium Ingress 或 Envoy 作为 L7 代理。Cilium 通过 CiliumEnvoyConfig 资源来管理 Envoy 实例,实现高性能的 L7 流量控制。

4.2.1 流量路径对比

模式 数据路径 性能特征 策略管理
传统 Ingress + Sidecar Ingress Controller → Sidecar (Envoy) → App 较高延迟,资源占用大 独立管理 Ingress 和网络策略
Cilium Ingress (Envoy) Ingress Controller (Cilium 管理) → App 低延迟,eBPF 加速 统一通过 CiliumNetworkPolicy 管理

4.2.2 Cilium Ingress 策略示例

通过 CiliumEnvoyConfig 和 CiliumClusterwideEnvoyConfig,运维人员可以定义精细的 L7 路由规则,这些规则会直接注入到 Cilium 管理的 Envoy 实例中。

apiVersion: cilium.io/v2
kind: CiliumClusterwideEnvoyConfig
metadata:
  name: ingress-l7-routes
spec:
  resources:
  - @type: type.googleapis.com/envoy.config.listener.v3.Listener
    name: ingress-listener
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          @type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/api/v2"
                route:
                  cluster: backend-cluster
                typed_per_filter_config:
                  envoy.filters.http.lua:
                    @type: type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
                    inline_code: |
                      function envoy_on_request(request_handle)
                        if request_handle:headers():get(":method") == "DELETE" then
                          request_handle:respond({[":status"] = "403"}, "Forbidden by L7 Policy")
                        end
                      end
          http_filters:
          - name: envoy.filters.http.router
容量基线校准警告: 在启用 Cilium Ingress 并配置复杂的 L7 策略(如正则匹配、Lua 脚本过滤)时,务必进行压测。Envoy 的线程模型和 eBPF 的 hook 点可能会在高并发场景下成为瓶颈。建议在压测报告中记录 P99 延迟和 CPU 使用率,用于校准容量基线。

4.3 L7 HTTP 策略与 Ingress 协同工作流

下图展示了 Cilium L7 策略与 Kubernetes Ingress 协同处理外部请求的完整流程。从 Ingress 控制器接收请求,到 eBPF 程序进行 L3/L4 过滤,再到 Envoy 代理执行 L7 策略,最后到达目标 Pod。

Cilium L7 策略与 Ingress 协同工作流 外部客户端 K8s Ingress 控制器 eBPF 内核层 (L3/L4) Envoy L7 代理 目标 Pod (App) Cilium 策略引擎 关键说明: 1. 外部请求首先到达 Ingress 控制器,进行域名和路由分发。 2. eBPF 程序在数据包进入节点时执行 L3/L4 策略过滤,实现高性能准入。 3. 通过 L7 策略的请求被转发至 Envoy 代理,执行 HTTP 方法、路径、Header 匹配。

4.4 压测驱动的策略准入评审要点

在基于压测数据调整 L7 策略时,运维团队应重点关注以下指标,并将其纳入容量基线校准流程:

  • 策略匹配延迟: 测量从数据包到达 eBPF hook 点到 L7 策略匹配完成的时间。正则表达式和复杂的 Header 匹配会显著增加延迟。
  • Envoy 代理吞吐量: 监控 Envoy 的 listener.downstream_cx_total 和 cluster.upstream_rq_total 指标,评估 L7 策略对代理吞吐的影响。
  • 策略冲突检测: 使用 cilium policy trace 命令验证策略是否按预期生效,避免因策略冲突导致流量被意外丢弃。
  • Ingress 控制器资源消耗: 在压测期间,记录 Ingress 控制器的 CPU 和内存使用率,确保其不会成为新的瓶颈点。
准入策略评审清单:
  1. 确认所有 L7 策略均使用 method 字段限制 HTTP 动词,避免不必要的 ALLOW ALL 规则。
  2. 优先使用前缀匹配代替正则匹配,除非业务逻辑必须使用复杂模式。
  3. 为所有 Ingress 流量配置默认的 deny 策略,仅显式允许必要的路径和 Header。
  4. 在压测报告中,将 L7 策略的 P99 延迟与基线延迟进行对比,偏差超过 10% 时需触发评审。