【Cilium / eBPF】策略编译:NetworkPolicy 到 BPF 与默认拒绝窗口
内容提要
本文介绍Cilium策略编译机制:从声明式策略经解析、选择器蒸馏为数字Identity,最终生成per-endpoint BPF策略map。重点分析default-deny按方向切入的时序窗口、Identity分配与传播延迟、ClusterMesh同步滞后等故障场景,并讨论L7代理重定向、实体规则及排障归因方法。
延伸解读
默认拒绝窗口的工程启示
文章指出,第一条含ingress或egress的NetworkPolicy被接受后,会按方向切入默认拒绝。若允许集不完整,合法流量可能被拒。工程上应先在非生产环境验证完整允许集,或使用EnableDefaultDeny的可见性策略作为第一刀,避免“先窄后补”的操作顺序导致误杀。
Identity 模型的双刃剑
Cilium用数字Identity替代IP作为策略键,消除了IP刷新税,但引入了身份分配与传播窗口。标签频繁抖动或Pod创建时,对端可能被识别为reserved:world或init,导致策略结果与稳态不一致。排障时需关注Identity生命周期,而非仅检查YAML。
L7 策略的编译分裂
含L7匹配的规则在policy map中携带proxy_port,将流量重定向到Envoy,由用户态判定。因此L4 map可能显示“允许重定向”,真正拒绝发生在Envoy。观测需同时看Hubble L7 verdict与Envoy指标,避免只盯policy map而误判。
实体规则与隐性依赖
策略编译不仅处理Pod selector,还包含host、world等实体。egress默认拒绝后,DNS解析、指标刮取、健康检查等依赖常被忽略,导致误伤。变更策略前应列出进程实际对等体,并注意toFQDN规则依赖DNS路径存活。
Q&A
Cilium 中 NetworkPolicy 是如何编译成 BPF 策略的?
Cilium 将声明式策略(如 NetworkPolicy、CiliumNetworkPolicy)解析为内部 PolicyEntry,然后将标签选择器解析为数字 Identity 集合,生成 MapState,最终写入 per-endpoint 的 BPF policy map。数据面通过查表(对端 Identity + 方向 + L4)决定 ALLOW、DENY 或重定向到代理。
Cilium 中 default-deny 是如何按方向切入的?
默认情况下,无策略时 endpoint 出入站均允许。当有规则选中 endpoint 且含 ingress 段时,入站切入 default-deny;含 egress 段时,出站切入 default-deny。切入是独立按方向进行的,例如只有 ingress 策略时,egress 仍保持允许。
Cilium 策略编译中,selector 是如何变成 Identity 键的?
Cilium 维护 CachedSelector 到 NumericIdentity 集合的映射。编译时,将每个 L4 filter 的对端 selector 解析为 Identity 集合,然后为每个 Identity 生成 map 键(方向、协议、端口、Identity)。数据面通过 ipcache 将 IP 解析为 Identity,再查表。
Cilium 中 default-deny 窗口有哪些类型?
主要有三类:1) 切入 default-deny 的瞬间,map 未写完可能导致短暂放行或误拒;2) Identity 分配与传播延迟,标签变化时对端可能被识别为错误 Identity;3) ClusterMesh 跨集群同步滞后,导致远端 Identity 未及时同步。
Cilium 中 L7 策略是如何编译的?
L7 策略编译后,policy map 条目携带 proxy_port,将流量重定向到节点上的 Envoy,由 Envoy 进行 L7 解析和判定。因此 L4 map 可能显示允许重定向,但实际拒绝发生在 Envoy,观测需同时看 Hubble L7 verdict 和 Envoy 指标。
Cilium 中实体(entity)规则在策略编译中起什么作用?
实体(如 host、world、remote-node、init)和保留 Identity 被编入同一套 map 键空间。出站访问公网、节点进程访问 Pod、健康检查等路径常依赖这些实体是否被显式允许,尤其在 egress 切入 default-deny 后,未放行相关实体会导致误伤。
Cilium 中策略排障时,如何根据现象定位原因?
常见现象与机制对应:apply 后大面积 DROPPED 可能是 default-deny 切入且允许集不全;仅新 Pod 被拒可能是新 Identity 未同步;改标签后间歇失败可能是旧 Identity 残留;同标签 Pod 行为不一致可能是实际安全标签不同;L7 规则 L4 通但 403 是 Envoy 拒绝;CIDR 放行但被拒可能是 Deny 优先。