4. Cilium 网络策略基础:Identity 概念、Endpoint 选择器、L3/L4 网络策略、L7 HTTP 策略

Cilium 的网络策略模型基于 eBPF 实现,其核心设计理念是 Identity(身份) 而非传统的 IP 地址。在 Kubernetes 环境中,Pod 的 IP 是动态且频繁变化的,Cilium 通过为每个 Endpoint(Pod)分配一个安全身份标识,使得网络策略能够稳定地绑定到工作负载的标签上,从而实现更灵活、更细粒度的访问控制。

4.1 Identity 概念与 Endpoint 选择器

Cilium 的 Identity 是一个 64 位的数字标识符,由 Cilium Agent 根据 Pod 的标签组合(Label Selector)计算得出。具有相同标签集合的 Pod 会被分配相同的 Identity。当 Pod 的标签发生变化时,其 Identity 也会随之更新。

Endpoint 选择器 是 Cilium 网络策略中用于匹配目标工作负载的核心机制。它基于 Kubernetes 标签选择器(Label Selector)来定义策略的生效范围,而不是传统的 IP 或 CIDR。

概念 说明 示例
Identity 基于 Pod 标签组合生成的唯一安全标识,用于替代 IP 地址进行策略匹配。 app=frontend,env=prod → Identity: 12345
Endpoint Selector 使用 matchLabels 或 matchExpressions 选择目标 Endpoint。 matchLabels: { app: backend }
Node Selector 将策略作用范围限定在特定节点上的 Endpoint。 matchLabels: { node-role: worker }
关键理解: 在 Cilium 中,网络策略的匹配单元是 Identity 而非 IP。这意味着即使 Pod 被重新调度到不同节点、IP 发生变化,只要其标签不变,策略依然自动生效。这为蓝绿发布场景下的流量切换提供了极大的稳定性。
Cilium Identity 与 Endpoint 选择器映射关系 Kubernetes Pods Pod A (app=frontend) Pod B (app=frontend) Pod C (app=backend) Pod D (app=backend) Cilium Identity Identity: 1001 ← app=frontend Identity: 1002 ← app=backend Endpoint Selector matchLabels: app: frontend matchLabels: app: backend

4.2 L3/L4 网络策略

L3/L4 网络策略是 Cilium 中最基础的访问控制策略,工作在 OSI 模型的网络层和传输层。它允许你基于 源/目的 Identity、IP、端口 和 协议 来定义流量规则。

与 Kubernetes 原生 NetworkPolicy 相比,Cilium 的 L3/L4 策略提供了更强的表达能力,例如支持 端口范围、ICMP 协议以及 基于 Identity 的精细化控制。

策略结构示例

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: l3-l4-policy
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
  egress:
  - toEndpoints:
    - matchLabels:
        app: database
    toPorts:
    - ports:
      - port: "3306"
        protocol: TCP
策略层级 匹配维度 典型场景
L3 源/目的 Identity、CIDR、Node 允许特定微服务访问,拒绝外部 IP 段
L4 端口、协议(TCP/UDP/SCTP/ICMP) 只允许 80/443 端口流量,禁止 SSH 访问
L3+L4 Identity + 端口 + 协议组合 仅允许 frontend 访问 backend 的 8080 端口
注意: 在蓝绿发布场景中,L3/L4 策略通常用于控制服务网格边车(Sidecar)之间的通信,确保只有经过身份验证的流量才能进入新版本(Green)环境。如果策略配置不当,可能导致蓝绿环境间的流量中断。

4.3 L7 HTTP 策略

Cilium 的 L7 HTTP 策略允许你在应用层(HTTP/HTTPS/gRPC)对流量进行深度检查和过滤。它基于 eBPF 在数据路径上直接解析应用层协议,无需引入额外的代理(如 Envoy),从而实现了高性能的七层策略执行。

L7 策略可以匹配 HTTP 的 方法(Method)、路径(Path)、主机(Host) 以及 头部(Headers),为微服务间的 API 调用提供精确的访问控制。

L7 HTTP 策略示例

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: l7-http-policy
spec:
  endpointSelector:
    matchLabels:
      app: api-gateway
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: "GET"
          path: "/api/v1/users"
        - method: "POST"
          path: "/api/v1/orders"
          headers:
          - "X-Request-Source: web"
匹配字段 说明 示例值
method HTTP 请求方法 GET, POST, PUT, DELETE
path 请求路径,支持精确匹配和通配符 /api/v1/*, /healthz
host 请求的 Host 头部 api.example.com
headers 自定义 HTTP 头部匹配 X-Version: v2
L7 HTTP 策略流量过滤流程 HTTP 请求 L3/L4 检查 Identity + Port L7 检查 Method + Path 允许/拒绝 策略拒绝

4.4 策略优先级与默认行为

Cilium 的网络策略遵循 白名单(Whitelist) 模型。默认情况下,所有流量都被拒绝,只有显式定义的规则才会允许流量通过。当存在多条策略时,Cilium 会按照以下优先级进行评估:

  1. L7 策略 优先级最高,如果 L7 规则匹配,则直接执行允许或拒绝。
  2. L3/L4 策略 次之,如果 L7 未匹配,则回退到 L3/L4 规则。
  3. 默认拒绝 作为兜底,如果没有任何策略匹配,流量将被丢弃。
蓝绿发布实践提示: 在切换流量到 Green 环境前,建议先部署一条宽松的 L3/L4 策略(允许所有来自 Blue 环境的流量),待验证通过后,再逐步收紧为 L7 策略,确保发布过程中的零信任安全基线。

4.5 策略调试与验证

在编写和部署 Cilium 网络策略后,可以使用以下命令进行调试和验证:

# 查看当前 Endpoint 及其 Identity
kubectl exec -n kube-system ds/cilium -- cilium endpoint list

# 查看特定 Pod 的策略执行状态
kubectl exec -n kube-system ds/cilium -- cilium endpoint get <pod-ip>

# 实时监控策略命中情况
kubectl exec -n kube-system ds/cilium -- cilium monitor -t policy-verdict

# 使用 Hubble 可视化流量与策略
hubble observe --from-pod default/frontend-xxx --to-pod default/backend-yyy