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 的策略引擎采用 分层叠加 模型,不同层级的策略按优先级顺序评估。理解这个层级结构,能帮助你在排障时快速定位哪条策略导致了流量被放行或拒绝。
4.3 优先级评估规则详解
策略评估遵循 “首次匹配即生效” 原则,具体规则如下:
- 集群范围策略优先:
CiliumClusterwideNetworkPolicy中的规则优先级最高,会覆盖命名空间级别的策略。 - 命名空间策略次之:
CiliumNetworkPolicy在命名空间内生效,优先级高于 Kubernetes 原生 NetworkPolicy。 - Kubernetes NetworkPolicy 第三:Cilium 会将原生 NetworkPolicy 翻译为内部策略,其优先级低于 Cilium 自定义策略。
- 默认允许兜底:如果没有任何策略匹配,Cilium 默认允许流量通过(与 Kubernetes 默认行为一致)。
- 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 的流日志,可以精确判断流量是被哪一层级的哪条策略拒绝。