4. 网络策略基础:CiliumNetworkPolicy 与 Kubernetes NetworkPolicy 的区别、策略层级与优先级

在服务目录平台环境中,网络策略是保障微服务间安全通信的核心防线。Kubernetes 原生提供了 NetworkPolicy 资源,但其能力在 L3/L4 层面存在局限;Cilium 通过 CiliumNetworkPolicy 扩展了策略模型,支持 L3-L7 全栈控制。理解两者的区别以及策略的层级与优先级,是进行故障排查的前提。

4.1 核心区别:Kubernetes NetworkPolicy vs CiliumNetworkPolicy

对比维度 Kubernetes NetworkPolicy CiliumNetworkPolicy
协议层支持 仅 L3/L4(IP + 端口) L3/L4 + L7(HTTP/gRPC/Kafka/DNS 等)
选择器机制 仅 podSelector / namespaceSelector 支持 podSelector、namespaceSelector、endpointSelector、nodeSelector、CIDR、serviceSelector
规则方向 ingress / egress 独立定义 ingress / egress 独立定义,支持 deny 规则
L7 感知 不支持 支持 HTTP 方法、路径、Header;gRPC service/method;Kafka topic 等
集群范围 仅命名空间内生效 支持 CiliumClusterwideNetworkPolicy(跨命名空间、跨集群)
默认行为 无策略时允许所有流量 无策略时允许所有流量;一旦应用策略,未显式允许的流量被拒绝
日志与可观测性 无原生日志 集成 Hubble,支持流日志、策略命中/拒绝事件
排障要点: 在服务目录平台中,如果发现某个服务无法被其他服务访问,首先应检查是否存在 CiliumNetworkPolicy 的 L7 规则拒绝了请求(例如 HTTP 方法或路径不匹配),而不仅仅是检查 Kubernetes NetworkPolicy 的端口放行。

4.2 策略层级与优先级模型

Cilium 的策略引擎采用 分层叠加 模型,不同层级的策略按优先级顺序评估。理解这个层级结构,能帮助你在排障时快速定位哪条策略导致了流量被放行或拒绝。

Cilium 策略层级与优先级模型 层级 1:集群默认策略(最高优先级) CiliumClusterwideNetworkPolicy — 全局 deny / allow 规则 层级 2:命名空间策略 CiliumNetworkPolicy — 作用于特定命名空间内的端点 层级 3:Kubernetes NetworkPolicy 原生 K8s 策略 — 仅 L3/L4,由 Cilium 翻译并执行 层级 4:默认允许(最低优先级) 未匹配任何策略时,流量默认被允许(Cilium 默认行为) ⚠ 优先级规则:高优先级策略优先匹配,一旦匹配则不再评估低优先级策略

4.3 优先级评估规则详解

策略评估遵循 “首次匹配即生效” 原则,具体规则如下:

  1. 集群范围策略优先:CiliumClusterwideNetworkPolicy 中的规则优先级最高,会覆盖命名空间级别的策略。
  2. 命名空间策略次之:CiliumNetworkPolicy 在命名空间内生效,优先级高于 Kubernetes 原生 NetworkPolicy。
  3. Kubernetes NetworkPolicy 第三:Cilium 会将原生 NetworkPolicy 翻译为内部策略,其优先级低于 Cilium 自定义策略。
  4. 默认允许兜底:如果没有任何策略匹配,Cilium 默认允许流量通过(与 Kubernetes 默认行为一致)。
  5. Deny 规则优先于 Allow:在同一层级内,显式的 deny 规则优先级高于 allow 规则。
常见排障陷阱: 很多工程师认为 Kubernetes NetworkPolicy 的默认行为是“拒绝所有”,但实际上 没有策略时默认允许。Cilium 同样遵循此规则。如果你期望“默认拒绝”,必须显式创建一条拒绝所有流量的策略。

4.4 策略冲突与覆盖场景

在服务目录平台中,多个团队可能同时管理不同层级的策略,容易产生冲突。以下表格列出了典型冲突场景及实际生效结果:

场景 策略 A(高优先级) 策略 B(低优先级) 实际生效
集群 deny vs 命名空间 allow CiliumClusterwideNetworkPolicy deny all CiliumNetworkPolicy allow port 80 Deny(集群策略覆盖)
命名空间 deny vs K8s allow CiliumNetworkPolicy deny egress Kubernetes NetworkPolicy allow egress Deny(Cilium 策略优先级更高)
同层级 deny vs allow CiliumNetworkPolicy deny 10.0.0.0/8 CiliumNetworkPolicy allow 10.0.1.0/24 Deny(deny 规则优先)
同层级 allow vs allow(不同端口) CiliumNetworkPolicy allow port 80 CiliumNetworkPolicy allow port 443 两者均允许(规则叠加)

4.5 排障实用命令与策略验证

当怀疑策略配置错误时,使用以下命令快速验证策略层级与生效状态:

# 查看集群中所有 CiliumNetworkPolicy 资源
kubectl get cnp --all-namespaces

# 查看集群范围策略
kubectl get ccnp

# 查看特定 Pod 上实际生效的策略(需要 Cilium CLI)
cilium endpoint list
cilium endpoint get <endpoint-id> -o json | jq '.policy'

# 使用 Hubble 观察策略命中与拒绝事件
hubble observe --namespace service-catalog --verdict DROPPED

# 检查策略是否被正确翻译为 BPF 规则
cilium bpf policy list <endpoint-id>
关键结论: 在服务目录平台排障时,始终按照 集群策略 → 命名空间策略 → K8s 原生策略 → 默认允许 的层级顺序检查。优先确认是否存在高优先级的 deny 规则,再逐层向下排查。结合 Hubble 的流日志,可以精确判断流量是被哪一层级的哪条策略拒绝。