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 组件负责,其生命周期如下:
- 标签提取: 当 Pod 启动时,Cilium Agent 监听 Kubernetes API,提取 Pod 及其所属 Namespace、ServiceAccount 的标签。
- 身份计算: 将标签集合进行排序和哈希,生成一个唯一的 64 位整数作为 Identity。
- KV Store 同步: Identity 被写入 etcd(或 CRD 模式下的本地存储),确保集群内所有节点对该 Identity 的认知一致。
- BPF Map 映射: 该 Identity 被写入节点上的 BPF Map,用于后续的数据包匹配。
| 特性 | 传统 IP 策略 | Cilium Identity 策略 |
|---|---|---|
| 策略目标 | IP 地址段(CIDR) | 标签集合(Label Set) |
| 动态适应 | Pod 重建后 IP 变化,策略失效 | Pod 重建后标签不变,Identity 不变,策略持续生效 |
| 规则密度 | 需要为每个 Pod IP 编写规则,规则数量随 Pod 数量线性增长 | 按标签分组,规则数量与业务逻辑相关,与 Pod 数量解耦 |
| 运维复杂度 | 高,需要持续维护 IP 清单 | 低,只需关注业务标签 |
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) 程序,挂载到网络数据路径的关键钩子点。
其核心生效流程如下:
- 策略解析: Cilium Agent 监听 CiliumNetworkPolicy CRD 的变化,将 YAML 规则解析为内部数据结构。
- BPF 代码生成: 将策略规则(Identity、端口、协议)编译为 BPF 字节码。每个 Identity 对(源 Identity → 目标 Identity)会生成一条高效的 BPF 映射条目。
- BPF Map 更新: 编译后的 BPF 程序被加载到内核,同时更新 Policy Map。该 Map 的 Key 是
(源Identity, 目标Identity, 端口, 协议)的元组,Value 是允许/拒绝的动作。 - 数据包匹配: 当数据包到达节点时,BPF 程序在 TC(Traffic Control) 或 XDP(eXpress Data Path) 层执行。它提取数据包的源/目标 Identity(从 BPF Map 中查找),然后查询 Policy Map 进行决策。
3.5 关键概念对比与总结
| 概念 | 作用域 | 匹配依据 | 性能特征 |
|---|---|---|---|
| Identity | 集群全局 | Pod 标签集合 | 64 位整数,BPF Map 直接匹配,O(1) 复杂度 |
| Endpoint Selector | 策略规则内 | Kubernetes 标签选择器 | 策略解析阶段完成,不影响数据路径 |
| L3/L4 规则 | 策略规则内 | IP/CIDR、端口、协议 | 编译为 BPF 字节码,内核态执行 |
核心结论: Cilium 通过 Identity 将动态的 IP 抽象为稳定的标签身份,利用 Endpoint Selector 实现声明式的策略定义,并借助 BPF 技术将策略直接编译为内核级执行代码。这种架构使得 Cilium 网络策略具备 高动态适应性、低规则密度 和 接近硬件转发的性能,是云原生容器网络准入控制的理想基础。