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
4.3 L7 HTTP 策略与 Ingress 协同工作流
下图展示了 Cilium L7 策略与 Kubernetes Ingress 协同处理外部请求的完整流程。从 Ingress 控制器接收请求,到 eBPF 程序进行 L3/L4 过滤,再到 Envoy 代理执行 L7 策略,最后到达目标 Pod。
4.4 压测驱动的策略准入评审要点
在基于压测数据调整 L7 策略时,运维团队应重点关注以下指标,并将其纳入容量基线校准流程:
- 策略匹配延迟: 测量从数据包到达 eBPF hook 点到 L7 策略匹配完成的时间。正则表达式和复杂的 Header 匹配会显著增加延迟。
- Envoy 代理吞吐量: 监控 Envoy 的
listener.downstream_cx_total和cluster.upstream_rq_total指标,评估 L7 策略对代理吞吐的影响。 - 策略冲突检测: 使用
cilium policy trace命令验证策略是否按预期生效,避免因策略冲突导致流量被意外丢弃。 - Ingress 控制器资源消耗: 在压测期间,记录 Ingress 控制器的 CPU 和内存使用率,确保其不会成为新的瓶颈点。
- 确认所有 L7 策略均使用
method字段限制 HTTP 动词,避免不必要的ALLOW ALL规则。 - 优先使用前缀匹配代替正则匹配,除非业务逻辑必须使用复杂模式。
- 为所有 Ingress 流量配置默认的
deny策略,仅显式允许必要的路径和 Header。 - 在压测报告中,将 L7 策略的 P99 延迟与基线延迟进行对比,偏差超过 10% 时需触发评审。