4. Cilium 高级策略:L7 HTTP/gRPC 策略、DNS策略、基于身份的安全策略

在云原生灾备与蓝绿发布场景中,基础网络策略(L3/L4)仅能控制“能否连通”,无法感知应用层流量内容。Cilium 基于 eBPF 的高级策略引擎允许在 L7 层对 HTTP/gRPC 请求进行细粒度控制,同时通过 DNS 策略管理外部访问,并利用基于身份的安全模型简化大规模集群的权限管理。本章将深入解析这三种高级策略的核心机制与配置方法。

4.1 L7 HTTP/gRPC 策略:应用层流量管控

L7 策略使 Cilium 能够检查 HTTP 方法、路径、头部以及 gRPC 服务方法,实现“零信任”应用层访问控制。在灾备切换或蓝绿发布期间,可通过 L7 策略精确引导流量,例如仅允许特定版本的客户端访问新版服务。

4.1.1 HTTP 策略规则

HTTP 策略通过 http 字段定义,支持 method、path、host 和 headers 匹配。以下示例仅允许 GET 请求访问 /api/v1/ 路径,并校验请求头中的 X-Version 字段。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "l7-http-restrict"
spec:
  endpointSelector:
    matchLabels:
      app: frontend
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: gateway
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: "GET"
          path: "/api/v1/.*"
          headers:
          - "X-Version: v2"
关键参数说明:
  • method:匹配 HTTP 方法(GET/POST/PUT/DELETE 等),支持通配符 *。
  • path:使用正则表达式匹配 URL 路径,如 /api/v1/.*。
  • headers:匹配请求头键值对,支持精确匹配或前缀匹配。
  • host:可选,匹配 HTTP Host 头部,用于多域名场景。

4.1.2 gRPC 策略规则

gRPC 策略通过 grpc 字段定义,匹配 service 和 method。以下策略仅允许调用 payment.PaymentService 的 ProcessPayment 方法。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "l7-grpc-restrict"
spec:
  endpointSelector:
    matchLabels:
      app: payment-service
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: order-service
    toPorts:
    - ports:
      - port: "50051"
        protocol: TCP
      rules:
        grpc:
        - service: "payment.PaymentService"
          method: "ProcessPayment"
实践建议:在蓝绿发布场景中,建议为每个服务版本(如 version: v2)创建独立的 L7 策略。当新版本验证通过后,通过更新策略中的 fromEndpoints 或 headers 条件,逐步将流量从旧版本迁移至新版本,实现零中断切换。

4.2 DNS 策略:安全控制外部访问

云原生应用常需访问外部服务(如数据库、API 网关)。Cilium 的 DNS 策略允许基于域名而非 IP 地址控制出站流量,解决了传统网络策略中外部 IP 动态变化的管理难题。在灾备场景中,DNS 策略可确保流量仅流向已验证的外部端点,防止 DNS 劫持或错误解析导致的数据泄露。

4.2.1 DNS 策略配置

DNS 策略通过 toFQDNs 字段定义,支持精确域名、通配符和正则表达式。以下策略仅允许 app 标签的 Pod 访问 api.example.com 和 *.trusted-domain.io。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "dns-external-access"
spec:
  endpointSelector:
    matchLabels:
      app: worker
  egress:
  - toFQDNs:
    - matchName: "api.example.com"
    - matchPattern: "*.trusted-domain.io"
    toPorts:
    - ports:
      - port: "443"
        protocol: TCP

4.2.2 DNS 策略与缓存机制

Cilium 内置 DNS 代理,自动拦截 Pod 的 DNS 查询并缓存解析结果。策略中的域名会在首次解析后生成对应的 IP 规则,并随 TTL 自动更新。下表总结了 DNS 策略的关键行为:

特性 说明 灾备场景价值
域名匹配 支持 matchName(精确)和 matchPattern(通配符) 允许灾备站点使用相同域名,策略无需修改
DNS 代理 拦截 Pod DNS 请求,缓存解析结果 减少外部 DNS 查询,提升灾备切换时的响应速度
TTL 感知 根据 DNS TTL 自动更新 IP 规则 外部端点 IP 变更时自动适配,避免策略失效
通配符限制 仅支持前缀通配符(如 *.example.com) 防止过度宽松的匹配,降低安全风险
注意:DNS 策略依赖 Cilium 的 DNS 代理功能,需确保集群 DNS 配置正确。在灾备演练中,建议提前验证 DNS 解析路径,避免因 DNS 超时导致策略生效延迟。

4.3 基于身份的安全策略:简化大规模集群管理

传统 Kubernetes 网络策略依赖 IP 地址或标签选择器,在 Pod 频繁重建或跨集群迁移时,IP 变化会导致策略维护成本激增。Cilium 引入基于身份(Identity)的安全模型,为每个 Pod 分配唯一的安全身份标识,策略直接绑定身份而非 IP,大幅提升可管理性。

4.3.1 身份分配机制

Cilium 根据 Pod 的标签组合计算安全身份。当 Pod 标签发生变化时,身份自动更新,策略即时生效。身份在集群范围内唯一,支持跨节点、跨集群使用。

# 查看 Pod 的安全身份
kubectl exec -n kube-system cilium-xxxxx -- cilium identity list
# 输出示例:
# ID   LABELS
# 1234 k8s:app=frontend; k8s:version=v2
# 5678 k8s:app=backend; k8s:version=v1

4.3.2 基于身份的策略示例

以下策略允许身份为 app=frontend 且 version=v2 的 Pod 访问 app=backend 的 Pod,无需关心 Pod 的 IP 地址。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "identity-based-access"
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
        version: v2
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP

4.3.3 身份策略与灾备迁移

在跨集群灾备迁移场景中,基于身份的策略优势尤为突出。下图展示了身份策略如何简化迁移流程:

基于身份的策略在灾备迁移中的应用 源集群(生产) frontend:v2 身份ID: 1234 backend:v1 身份ID: 5678 策略:身份1234 → 身份5678:80 迁移 目标集群(灾备) frontend:v2 身份ID: 1234 backend:v1 身份ID: 5678 策略自动生效,无需修改 身份ID 基于标签计算,跨集群一致 → 策略零修改迁移

4.4 三种高级策略对比与选型

在实际灾备与蓝绿发布场景中,需要根据流量类型和安全需求选择合适的策略类型。下表总结了三种策略的核心差异:

策略类型 控制层级 匹配依据 典型场景 灾备优势
L7 HTTP/gRPC 应用层(L7) HTTP 方法/路径/头部、gRPC 服务/方法 API 网关、微服务间调用 按版本精确控制流量,支持蓝绿发布灰度
DNS 策略 传输层(L3/L4) 域名、通配符 外部服务访问、数据库连接 域名不变即可迁移,无需关心外部 IP 变化
基于身份策略 网络层(L3/L4) 安全身份 ID(基于标签) 大规模集群、跨集群迁移 身份跨集群一致,策略零修改迁移

4.5 策略组合与最佳实践

在复杂的灾备场景中,通常需要组合使用多种策略。以下是一个综合示例,展示如何为蓝绿发布环境配置完整的策略体系:

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "blue-green-combined"
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
  # 基于身份:仅允许 frontend 访问
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        # L7 策略:仅允许 GET /api/v2/,并校验版本头
        - method: "GET"
          path: "/api/v2/.*"
          headers:
          - "X-Version: blue"
  egress:
  # DNS 策略:仅允许访问灾备数据库域名
  - toFQDNs:
    - matchName: "db-dr.example.com"
    toPorts:
    - ports:
      - port: "5432"
        protocol: TCP
最佳实践清单:
  1. 分层防御:先使用基于身份的策略控制 Pod 间连通性,再叠加 L7 策略细化应用层权限。
  2. 最小权限原则:DNS 策略中避免使用 * 通配符,优先使用 matchName 精确匹配。
  3. 版本标签化:为每个服务版本打上 version 标签,便于身份策略按版本隔离。
  4. 灾备预配置:在灾备集群中提前创建相同的身份策略,确保迁移后策略自动生效。
  5. 策略审计:定期使用 cilium policy trace 命令验证策略路径,避免配置错误。
三种高级策略协同工作流程 外部请求 HTTP/gRPC 客户端 DNS 策略 域名解析 & 访问控制 身份策略 Pod 身份验证 L7 策略 HTTP/gRPC 方法校验 目标服务 backend:v2 拒绝 三层策略逐级过滤:DNS → 身份 → L7,确保端到端安全