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 到最终放行/拒绝的完整匹配流程:
2.5 多租户场景下的选择器典型配置
以下表格总结了多租户环境中常用的选择器组合模式及其适用场景:
| 模式 | 选择器组合 | 适用场景 |
|---|---|---|
| 同命名空间隔离 | podSelector 仅匹配本命名空间 | 同一租户内微服务间访问控制 |
| 跨命名空间白名单 | namespaceSelector + podSelector | 允许特定租户访问共享服务 |
| 全租户隔离 | namespaceSelector 匹配租户标签 | 禁止跨租户命名空间通信 |
| 外部访问控制 | ipBlock + 端口限制 | 允许特定外部 CIDR 访问 API 网关 |
故障排查黄金法则:当多租户网络出现连通性故障时,首先检查目标 Pod 所在命名空间是否存在 NetworkPolicy,然后逐条验证 policyTypes、选择器匹配、端口规则三个层级。使用
kubectl describe networkpolicy 查看规则详情,结合 kubectl get pods --show-labels 确认标签匹配情况。