3. Cilium 网络策略基础:Identity 概念、Endpoint 选择器、L3/L4 网络策略规则编写与生效原理

3.1 核心抽象:Cilium Identity(安全身份)

Cilium 网络策略的基石是 Identity(身份),而非传统的 IP 地址。在 Kubernetes 环境中,Pod 的 IP 是动态且频繁变化的,直接基于 IP 编写策略会导致规则爆炸且难以维护。Cilium 通过为每个 Endpoint(Pod)分配一个基于其 标签(Labels) 的 64 位数字身份,实现了策略与 IP 的解耦。

关键设计理念: 策略不关心“你是谁(IP)”,只关心“你是什么(Label)”。Identity 是标签的哈希摘要,确保相同标签集合的 Pod 共享同一身份,极大简化了策略规则。

Identity 的分配由 Cilium Agent 中的 Identity Allocator 组件负责,其生命周期如下:

  1. 标签提取: 当 Pod 启动时,Cilium Agent 监听 Kubernetes API,提取 Pod 及其所属 Namespace、ServiceAccount 的标签。
  2. 身份计算: 将标签集合进行排序和哈希,生成一个唯一的 64 位整数作为 Identity。
  3. KV Store 同步: Identity 被写入 etcd(或 CRD 模式下的本地存储),确保集群内所有节点对该 Identity 的认知一致。
  4. BPF Map 映射: 该 Identity 被写入节点上的 BPF Map,用于后续的数据包匹配。
特性 传统 IP 策略 Cilium Identity 策略
策略目标 IP 地址段(CIDR) 标签集合(Label Set)
动态适应 Pod 重建后 IP 变化,策略失效 Pod 重建后标签不变,Identity 不变,策略持续生效
规则密度 需要为每个 Pod IP 编写规则,规则数量随 Pod 数量线性增长 按标签分组,规则数量与业务逻辑相关,与 Pod 数量解耦
运维复杂度 高,需要持续维护 IP 清单 低,只需关注业务标签
Cilium Identity 分配与映射流程 Kubernetes API Cilium Agent Identity Allocator KV Store (etcd) BPF Map (本地) 1. 监听 Pod 创建事件 2. 提取标签并哈希 3. 写入 BPF Map 用于匹配

3.2 Endpoint 选择器:策略的目标匹配机制

在 CiliumNetworkPolicy 中,Endpoint Selector 是用于匹配目标 Pod 的核心机制。它基于 Kubernetes 标签选择器(Label Selector)语法,但作用域限定在 Cilium 管理的 Endpoint 上。

Endpoint Selector 支持两种匹配模式:

  • matchLabels: 精确匹配。要求目标 Pod 必须包含所有指定的标签键值对。
  • matchExpressions: 表达式匹配。支持 In、NotIn、Exists、DoesNotExist 等操作符,提供更灵活的匹配逻辑。
最佳实践: 建议使用 matchExpressions 进行策略编写,因为它能更好地处理标签的增删场景,避免因标签值拼写错误导致策略失效。

以下是一个 Endpoint Selector 的 YAML 示例:

# 选择所有包含 "app: frontend" 标签的 Pod
endpointSelector:
  matchLabels:
    app: frontend

# 选择所有运行在 "production" 环境且不属于 "monitoring" 组的 Pod
endpointSelector:
  matchExpressions:
    - key: environment
      operator: In
      values: ["production"]
    - key: group
      operator: NotIn
      values: ["monitoring"]

3.3 L3/L4 网络策略规则编写

Cilium 网络策略在 L3(网络层) 和 L4(传输层) 提供精细化的访问控制。规则通过 Ingress(入站)和 Egress(出站)两个方向进行定义。

3.3.1 入站规则(Ingress)

Ingress 规则控制哪些流量可以进入被 endpointSelector 选中的 Pod。其核心结构如下:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-frontend-to-backend
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: frontend
      toPorts:
        - ports:
            - port: "8080"
              protocol: TCP

规则解读:

  • endpointSelector: 策略的目标是标签为 app: backend 的 Pod。
  • fromEndpoints: 允许来自标签为 app: frontend 的 Pod 的流量。
  • toPorts: 仅允许访问目标 Pod 的 8080/TCP 端口。

3.3.2 出站规则(Egress)

Egress 规则控制被选中的 Pod 可以访问哪些外部目标。以下是一个允许访问外部数据库的示例:

spec:
  endpointSelector:
    matchLabels:
      app: api-server
  egress:
    - toEndpoints:
        - matchLabels:
            app: database
      toPorts:
        - ports:
            - port: "5432"
              protocol: TCP
    - toCIDR:
        - 10.0.0.0/8
      toPorts:
        - ports:
            - port: "443"
              protocol: TCP

规则解读:

  • 允许 app: api-server 的 Pod 访问 app: database 的 5432/TCP 端口。
  • 同时允许其访问 10.0.0.0/8 网段的 443/TCP 端口(例如外部 API 网关)。
注意: 当同时使用 toEndpoints 和 toCIDR 时,它们是 OR 关系,即满足任一条件即可。如果需要同时满足,则需要拆分为多个独立的 Egress 规则。

3.4 策略生效原理:BPF 数据路径

Cilium 网络策略的生效并非通过传统的 iptables 或用户态代理,而是直接编译为 BPF(Berkeley Packet Filter) 程序,挂载到网络数据路径的关键钩子点。

其核心生效流程如下:

  1. 策略解析: Cilium Agent 监听 CiliumNetworkPolicy CRD 的变化,将 YAML 规则解析为内部数据结构。
  2. BPF 代码生成: 将策略规则(Identity、端口、协议)编译为 BPF 字节码。每个 Identity 对(源 Identity → 目标 Identity)会生成一条高效的 BPF 映射条目。
  3. BPF Map 更新: 编译后的 BPF 程序被加载到内核,同时更新 Policy Map。该 Map 的 Key 是 (源Identity, 目标Identity, 端口, 协议) 的元组,Value 是允许/拒绝的动作。
  4. 数据包匹配: 当数据包到达节点时,BPF 程序在 TC(Traffic Control) 或 XDP(eXpress Data Path) 层执行。它提取数据包的源/目标 Identity(从 BPF Map 中查找),然后查询 Policy Map 进行决策。
Cilium 网络策略 BPF 数据路径 数据包到达 BPF 程序 Identity 查找 Policy Map 查询 允许 / 拒绝 从 BPF Map 获取源/目标 Identity 匹配 (srcID, dstID, port, proto)

3.5 关键概念对比与总结

概念 作用域 匹配依据 性能特征
Identity 集群全局 Pod 标签集合 64 位整数,BPF Map 直接匹配,O(1) 复杂度
Endpoint Selector 策略规则内 Kubernetes 标签选择器 策略解析阶段完成,不影响数据路径
L3/L4 规则 策略规则内 IP/CIDR、端口、协议 编译为 BPF 字节码,内核态执行
核心结论: Cilium 通过 Identity 将动态的 IP 抽象为稳定的标签身份,利用 Endpoint Selector 实现声明式的策略定义,并借助 BPF 技术将策略直接编译为内核级执行代码。这种架构使得 Cilium 网络策略具备 高动态适应性、低规则密度 和 接近硬件转发的性能,是云原生容器网络准入控制的理想基础。