2. NetPolicy 核心对象:资源定义与规则体系

NetworkPolicy 是 Kubernetes 原生的网络隔离原语,也是实现多租户网络拓扑管控的基石。要准确排查多租户场景下的网络连通性故障,必须透彻理解 NetworkPolicy 的资源结构、Ingress/Egress 规则语义以及选择器的工作机制。本节从资源定义出发,逐步拆解规则构成与选择器匹配逻辑。

2.1 NetworkPolicy 资源定义结构

一个完整的 NetworkPolicy 资源由 API 版本、元数据、spec 三部分组成,其中 spec 包含 podSelector、policyTypes、ingress 和 egress 四个核心字段。以下是一个典型的多租户隔离策略示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-isolation
  namespace: team-alpha
spec:
  podSelector:
    matchLabels:
      app: frontend
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          tenant: alpha
      podSelector:
        matchLabels:
          role: api
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          tenant: alpha
    ports:
    - protocol: TCP
      port: 443
字段 类型 说明
podSelector LabelSelector 选定当前命名空间中受策略管控的 Pod 集合
policyTypes []PolicyType 声明策略生效方向:Ingress / Egress / 两者
ingress []IngressRule 入站白名单规则,定义允许访问的来源与端口
egress []EgressRule 出站白名单规则,定义允许访问的目的地与端口
关键理解:podSelector 为空时选中命名空间内所有 Pod;policyTypes 不声明时,默认仅对 Ingress 生效。多租户场景下,务必显式声明 policyTypes 以避免规则遗漏。

2.2 Ingress 与 Egress 规则详解

Ingress 和 Egress 规则采用对称的 from/to + ports 结构。每条规则可以包含多个来源(from)或目的地(to)块,以及端口列表。规则之间是 OR 关系,同一规则内的选择器之间是 AND 关系。

2.2.1 Ingress 规则

  • from:支持 podSelector、namespaceSelector、ipBlock 三种来源选择器
  • ports:允许的协议(TCP/UDP/SCTP)与端口号或端口名称
  • 空 from 表示拒绝所有入站流量;不写 ingress 块表示允许所有入站

2.2.2 Egress 规则

  • to:支持 podSelector、namespaceSelector、ipBlock 三种目的地选择器
  • ports:允许的出站协议与端口
  • 空 to 表示拒绝所有出站流量;不写 egress 块表示允许所有出站
排查要点:当 policyTypes 包含 Egress 但 egress 规则为空时,目标 Pod 的出站流量会被全部拒绝。这是多租户环境中常见的“能进不能出”故障根因。

2.3 PodSelector 与 NamespaceSelector 选择器机制

选择器是 NetworkPolicy 实现租户隔离的核心机制。理解选择器的组合逻辑,是定位网络策略冲突的前提。

选择器类型 作用范围 匹配方式
podSelector 当前命名空间 按 Pod 标签匹配,支持 matchLabels 和 matchExpressions
namespaceSelector 集群范围 按命名空间标签匹配,常用于跨租户隔离
ipBlock 集群外部 CIDR 按 IP 地址段匹配,支持 except 排除

2.3.1 选择器组合逻辑

  • 单一选择器:直接匹配目标对象
  • 同一规则内多个选择器:逻辑 AND,必须同时满足
  • 不同规则之间:逻辑 OR,满足任意一条规则即放行
  • podSelector + namespaceSelector 组合:限定特定命名空间中的特定 Pod
常见误区:namespaceSelector 匹配的是命名空间的标签,而非命名空间名称。多租户场景下,务必为每个租户命名空间打上统一的标签(如 tenant: alpha),否则 namespaceSelector 将无法正确匹配。

2.4 NetworkPolicy 规则匹配流程图

下图展示了 NetworkPolicy 规则从流量到达 Pod 到最终放行/拒绝的完整匹配流程:

NetworkPolicy 规则匹配流程 NetworkPolicy 规则匹配流程 流量到达 Pod 是否有匹配的 NetworkPolicy? policyTypes 包含当前方向? Ingress/Egress 规则是否匹配? 放行流量 拒绝流量 说明: • 无匹配策略 → 默认放行(Kubernetes 默认行为) • 有匹配策略但 policyTypes 不包含当前方向 → 默认放行 • 有匹配策略且 policyTypes 包含当前方向 → 按规则放行/拒绝

2.5 多租户场景下的选择器典型配置

以下表格总结了多租户环境中常用的选择器组合模式及其适用场景:

模式 选择器组合 适用场景
同命名空间隔离 podSelector 仅匹配本命名空间 同一租户内微服务间访问控制
跨命名空间白名单 namespaceSelector + podSelector 允许特定租户访问共享服务
全租户隔离 namespaceSelector 匹配租户标签 禁止跨租户命名空间通信
外部访问控制 ipBlock + 端口限制 允许特定外部 CIDR 访问 API 网关
故障排查黄金法则:当多租户网络出现连通性故障时,首先检查目标 Pod 所在命名空间是否存在 NetworkPolicy,然后逐条验证 policyTypes、选择器匹配、端口规则三个层级。使用 kubectl describe networkpolicy 查看规则详情,结合 kubectl get pods --show-labels 确认标签匹配情况。