4. 常见故障类型概览:连通性故障、策略冲突、命名空间泄漏、CNI 插件异常

在多租户 Kubernetes 集群中,NetworkPolicy 是隔离网络流量的核心手段,但实际运维中故障类型多样且相互交织。本章将四种最常见故障类型进行系统化分类,帮助运维人员快速定位问题根因。

4.1 故障类型总览

下表从故障现象、根因范围、影响面三个维度对比四种典型故障:

故障类型 典型现象 根因范围 影响面
连通性故障 Pod 间无法通信、超时、连接拒绝 策略缺失、标签不匹配、端口错误 租户内或跨租户
策略冲突 部分流量通过、部分被拦截,行为不一致 多条策略规则叠加、优先级歧义 单个租户或共享命名空间
命名空间泄漏 非预期 Pod 可访问受保护服务 namespaceSelector 范围过大、缺少隔离策略 跨租户安全边界
CNI 插件异常 所有 Pod 网络不通、策略不生效、节点报错 CNI 组件故障、配置错误、内核模块缺失 集群全局或节点级
关键认知: 四种故障并非完全独立。例如 CNI 异常可能导致所有策略失效,进而表现为连通性故障;策略冲突也可能被误判为命名空间泄漏。排查时应从底层(CNI)向顶层(策略规则)逐层验证。

4.2 连通性故障

连通性故障是最常见的表象,通常由以下三类原因引发:

  • 策略规则缺失: 未定义允许 ingress/egress 规则,默认 deny 生效。
  • 标签选择器不匹配: podSelector 或 namespaceSelector 的标签键值对与目标 Pod/命名空间实际标签不一致。
  • 端口/协议错误: 策略中指定的 port 或 protocol 与目标服务实际监听端口不匹配。
排查建议: 使用 kubectl run netshoot --image=nicolaka/netshoot -it --rm 启动诊断 Pod,通过 curl、nc、tcpdump 逐跳验证连通性。同时检查 kubectl describe networkpolicy 确认规则是否匹配目标 Pod。

4.3 策略冲突

当同一命名空间或跨命名空间存在多条 NetworkPolicy 时,规则叠加可能导致非预期的允许或拒绝。Kubernetes 的策略模型为“白名单叠加”——所有生效的 ingress/egress 规则取并集,但不同策略间的规则可能相互矛盾。

常见冲突场景:

  1. 默认拒绝 + 部分允许: 一条策略拒绝所有入站,另一条策略允许特定来源,实际行为取决于规则顺序和选择器范围。
  2. 跨命名空间策略重叠: 租户 A 的命名空间策略允许来自租户 B 的流量,但租户 B 的命名空间策略拒绝出站到租户 A,导致单向连通。
  3. 端口级冲突: 一条策略允许 TCP 80,另一条策略拒绝所有端口,最终结果取决于策略的生效顺序(Kubernetes 中策略无优先级,所有匹配策略均生效)。
避坑提示: Kubernetes NetworkPolicy 没有“优先级”或“权重”概念。所有匹配目标 Pod 的策略规则都会生效,且规则之间是“或”关系。不要试图通过策略顺序控制流量,应确保每条策略的规则集合是精确且无歧义的。

4.4 命名空间泄漏

命名空间泄漏指流量跨越了预期的租户边界,导致非授权访问。根本原因通常是 namespaceSelector 使用不当:

  • 空选择器: namespaceSelector: {} 匹配所有命名空间,极易造成泄漏。
  • 标签范围过大: 使用通用标签(如 env: production)作为选择器,可能意外匹配到其他租户的命名空间。
  • 缺少出站限制: 仅限制入站而不限制出站,Pod 仍可主动访问其他命名空间的服务。
最佳实践: 为每个租户命名空间打上唯一标签(如 tenant: alpha),并在策略中精确使用 namespaceSelector: matchLabels: {tenant: alpha}。同时为每个命名空间配置默认拒绝出站策略,防止数据外泄。

4.5 CNI 插件异常

CNI 插件是网络策略的底层执行者。如果 CNI 组件异常,所有 NetworkPolicy 规则都将失效。常见异常包括:

异常类型 典型症状 排查方向
DaemonSet Pod 异常 calico-node / cilium-agent 等 Pod 处于 CrashLoopBackOff 检查日志、资源限制、节点内核版本
CNI 配置丢失 节点上 /etc/cni/net.d/ 目录为空或配置错误 检查 kubelet 配置、CNI 安装脚本
内核模块缺失 iptables 规则未写入、eBPF 程序加载失败 检查内核版本、模块加载状态
数据平面故障 Pod 间 ping 通但策略不生效 检查 Felix/Cilium agent 状态、策略同步日志
快速验证: 在 CNI 异常时,即使删除所有 NetworkPolicy,Pod 间仍可能无法通信。反之,如果删除策略后 Pod 恢复正常通信,则问题大概率在策略层而非 CNI 层。

4.6 故障类型关系图

下图展示了四种故障类型之间的依赖与转化关系,帮助运维人员在排查时建立全局视角:

常见故障类型关系图 连通性故障 现象层 策略冲突 规则层 命名空间泄漏 边界层 CNI 插件异常 基础设施层 排查顺序建议 1. 检查 CNI 是否正常 2. 验证命名空间边界 3. 分析策略规则冲突 故障转化关系 CNI 异常 → 所有策略失效 策略冲突 → 连通性故障 命名空间泄漏 → 安全事件
排查原则: 始终从基础设施层(CNI)开始验证,确认底层网络正常后再逐层向上排查策略规则。避免在 CNI 异常时盲目调整 NetworkPolicy 规则,那样只会增加排查复杂度。