3. Cilium 网络策略核心:Identity、Endpoint 选择器与策略模型
Cilium 网络策略的底层逻辑与 Kubernetes 原生 NetworkPolicy 有本质区别。Kubernetes 原生策略依赖 Pod IP 和标签选择器,而 Cilium 引入了 Identity(身份) 概念,将安全策略与 IP 解耦,使得策略在动态编排环境中更加稳定、高效。本章深入剖析 Identity 机制、Endpoint 选择器、L3/L4/L7 策略模型以及策略执行顺序,为后续资源画像与成本优化打下基础。
3.1 Identity 概念:策略与 IP 解耦的核心
在 Cilium 中,每个 Endpoint(Pod 或外部网络端点)都会被分配一个全局唯一的 Security Identity。这个 Identity 基于 Endpoint 的标签集合计算得出,并缓存在 Cilium Agent 的本地 BPF Map 中。当 Pod 的标签发生变化时,Identity 会重新计算并同步。
关键优势: 策略规则不再依赖 Pod IP(IP 会随 Pod 重启、迁移而变化),而是基于 Identity。这使得策略在集群扩缩容、节点故障、Pod 滚动更新时依然保持正确,大幅降低策略维护成本。
| 特性 | Kubernetes 原生 NetworkPolicy | Cilium NetworkPolicy (基于 Identity) |
|---|---|---|
| 策略匹配依据 | Pod IP + 标签选择器 | Security Identity(基于标签计算) |
| IP 变化影响 | 策略可能失效,需重新同步 | 策略不变,Identity 自动更新 |
| 大规模集群性能 | IP 规则数量随 Pod 数线性增长 | Identity 数量远小于 Pod 数,BPF 查找更快 |
| 策略迁移/升级 | 需重新计算 IP 段,风险较高 | Identity 不变,策略无缝迁移 |
3.2 Endpoint 选择器:基于 Identity 的精准匹配
Cilium 策略使用 endpointSelector 来匹配目标 Endpoint。与 Kubernetes 原生 podSelector 不同,Cilium 的 endpointSelector 直接匹配 Security Identity,而不是 Pod 标签本身。这意味着:
- 匹配效率更高: BPF 程序直接比较 Identity 数值,无需遍历标签。
- 支持更丰富的匹配条件: 除了标签,还可以匹配 Namespace、Cluster、Service 等。
- 支持外部端点: 可以匹配集群外部的 IP 或 DNS 名称,统一策略模型。
最佳实践: 在编写 CiliumNetworkPolicy 时,优先使用
endpointSelector 配合 matchLabels 或 matchExpressions。避免使用 fromEndpoints 中的 IP 段,除非有特殊的外部访问需求。
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
3.3 L3/L4/L7 策略模型:分层安全控制
Cilium 策略模型分为三层,每一层解决不同粒度的安全问题。理解这三层模型,是设计精细化策略、避免过度授权的基础。
3.4 策略执行顺序:规则优先级与冲突解决
Cilium 策略的执行顺序遵循 白名单(默认拒绝) 模型,且规则按以下优先级处理:
- 默认拒绝: 如果没有显式允许规则,所有流量被拒绝。
- L3/L4 规则优先: 基于 Identity 和端口号的规则最先匹配。
- L7 规则次之: 在 L3/L4 允许通过后,再检查 L7 应用层规则。
- 规则合并: 多个策略作用于同一 Endpoint 时,规则取 并集(只要有一个策略允许,则允许)。
- 规则冲突: 如果同一流量同时匹配允许和拒绝规则,拒绝规则优先(安全优先)。
常见陷阱: 当多个 CiliumNetworkPolicy 作用于同一个 Pod 时,如果其中一个策略允许了某个端口,另一个策略拒绝了该端口,最终结果是 拒绝。务必使用
kubectl describe cnp 查看策略状态,避免意外阻断。
3.5 策略执行流程:从 Endpoint 到 BPF 的完整链路
理解策略如何从 YAML 文件转化为 BPF 程序,有助于诊断策略问题和优化性能。
3.6 策略调试与验证
在升级或变更策略前,务必使用以下工具验证策略效果:
| 工具/命令 | 用途 | 示例 |
|---|---|---|
cilium endpoint list |
查看所有 Endpoint 及其 Identity | cilium endpoint list | grep my-pod |
cilium policy trace |
模拟流量,验证策略是否允许/拒绝 | cilium policy trace --src-k8s-pod default/frontend --dst-k8s-pod default/backend --dport 8080 |
cilium monitor |
实时监控数据包和策略决策 | cilium monitor --type drop |
kubectl describe cnp |
查看 CiliumNetworkPolicy 状态 | kubectl describe cnp allow-frontend-to-backend |
升级前必做: 在测试环境使用
cilium policy trace 模拟所有关键业务路径的流量,确保升级后策略不会意外阻断。记录每次 trace 结果,作为升级回退的参考基线。