NetPolicy 基础概念:Kubernetes NetworkPolicy 介绍、Ingress 与 Egress 规则、Pod 选择器与命名空间隔离
在多租户签名链路中,网络隔离是保障租户数据安全与链路稳定性的第一道防线。Kubernetes NetworkPolicy 作为原生的网络访问控制机制,通过声明式规则定义 Pod 之间的通信策略,是实现微隔离(Micro-Segmentation)的核心工具。本节将系统讲解 NetworkPolicy 的核心概念、规则模型与隔离边界。
1. NetworkPolicy 概述
NetworkPolicy 是 Kubernetes 集群中用于控制 Pod 网络流量的资源对象。它基于 白名单模型:默认情况下,Pod 允许所有入站(Ingress)和出站(Egress)流量;一旦应用了 NetworkPolicy,未显式允许的流量将被拒绝。
| 特性 | 说明 |
|---|---|
| 资源类型 | networking.k8s.io/v1 |
| 作用范围 | 命名空间级别,仅对匹配的 Pod 生效 |
| 默认行为 | 未应用策略时,所有流量均被允许 |
| 策略模型 | 白名单:未显式允许即拒绝 |
| 依赖组件 | 需要 CNI 插件支持(Calico、Cilium、Antrea 等) |
2. Ingress 与 Egress 规则
NetworkPolicy 的核心由 Ingress(入站)和 Egress(出站)两部分规则组成。每条规则可以指定允许的源/目标、端口和协议。
2.1 Ingress 规则
Ingress 规则控制哪些流量可以进入目标 Pod。规则中通过 from 字段定义允许的源,支持三种匹配方式:
- ipBlock:基于 CIDR 地址段匹配(如集群外流量)
- namespaceSelector:基于命名空间标签选择
- podSelector:基于 Pod 标签选择
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-ingress
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
2.2 Egress 规则
Egress 规则控制目标 Pod 可以访问哪些外部地址。规则中通过 to 字段定义允许的目标,匹配方式与 Ingress 相同。
spec:
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
3. Pod 选择器与命名空间隔离
Pod 选择器(podSelector)和命名空间选择器(namespaceSelector)是 NetworkPolicy 实现精细化隔离的两大核心机制。
3.1 Pod 选择器
通过标签选择器匹配目标 Pod。空选择器(podSelector: {})表示匹配命名空间内的所有 Pod。
| 选择器类型 | 示例 | 匹配范围 |
|---|---|---|
| 精确匹配 | matchLabels: { app: signer } |
仅标签完全匹配的 Pod |
| 表达式匹配 | matchExpressions: [{ key: tier, operator: In, values: [frontend, backend] }] |
满足表达式的 Pod 集合 |
| 全选 | podSelector: {} |
命名空间内所有 Pod |
3.2 命名空间隔离
通过 namespaceSelector 实现跨命名空间的流量控制。结合 podSelector 可以精确到目标命名空间内的特定 Pod。
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
tenant: alpha
podSelector:
matchLabels:
app: signer
namespaceSelector 与 podSelector 在同一规则中为 AND 关系,即同时满足两个条件才允许。若需要 OR 关系,需拆分为多条规则。
4. NetworkPolicy 隔离模型图解
下图展示了 NetworkPolicy 在命名空间内的隔离逻辑,以及 Ingress/Egress 规则的匹配流程:
5. 策略类型与隔离层级
NetworkPolicy 支持三种策略类型,组合使用可实现不同粒度的隔离:
| 策略类型 | 配置方式 | 隔离效果 | 典型场景 |
|---|---|---|---|
| 仅 Ingress | policyTypes: [Ingress] |
仅控制入站流量,出站不受限 | 前端服务暴露给特定客户端 |
| 仅 Egress | policyTypes: [Egress] |
仅控制出站流量,入站不受限 | 签名服务仅允许访问数据库 |
| 双向 | policyTypes: [Ingress, Egress] |
入站和出站均受控 | 多租户签名链路的严格隔离 |
1. 租户间隔离:禁止跨命名空间的非授权访问
2. 服务间隔离:同一租户内,仅允许签名链路中的必要服务通信
3. 外部访问控制:通过 ipBlock 限制集群外部的访问来源
6. 常见误区与避坑指南
- 误区一: 认为 NetworkPolicy 可以控制 Service 流量。实际上,策略作用于 Pod IP,Service 的 ClusterIP 仅做负载均衡,策略仍需匹配后端 Pod。
- 误区二: 忘记设置
policyTypes字段。默认情况下,如果只配置了ingress字段,policyTypes会自动包含Ingress;但显式声明更安全。 - 误区三: 在同一个规则中混用
namespaceSelector和podSelector时误以为 OR 关系。记住:同一规则内是 AND 关系,OR 关系需要拆分为多条规则。 - 误区四: 忽略 CNI 插件的兼容性。部分 CNI 不支持
ipBlock或namespaceSelector的某些特性,生产环境需提前验证。