NetworkPolicy 规则要素是什么
一条 NetworkPolicy 回答三个问题:管哪些 Pod(podSelector)、管哪个方向(policyTypes 里的 Ingress 或 Egress)、放行谁(from 或 to)访问哪些端口(ports)。它是纯粹的白名单叠加模型:被策略选中且声明了某方向后,该方向只有被放行的流量才通过,没有显式的拒绝规则。策略本身只是声明,真正生效依赖支持 NetworkPolicy 的 CNI 插件。
基本信息
| 资源类型 | networking.k8s.io/v1 的 NetworkPolicy,命名空间级资源 |
|---|---|
| 作用对象 | 由 podSelector 选中的 Pod,按方向生效 |
| 方向声明 | policyTypes 列出 Ingress、Egress,不写时按规则内容推断 |
| 放行来源 | ingress.from 支持 podSelector、namespaceSelector、ipBlock |
| 放行目的 | egress.to 使用同样的三种选择器 |
| 前置条件 | 需要 Calico、Cilium 等支持策略的 CNI,否则策略不生效 |
入向与出向完整示例
入向与出向完整示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-policy
namespace: prod
spec:
podSelector:
matchLabels:
app: api
policyTypes: ["Ingress", "Egress"]
ingress:
- from:
- podSelector:
matchLabels:
app: web # 只允许带 app=web 的 Pod 访问
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: db
ports:
- protocol: TCP
port: 5432
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53 # 出向收紧后必须显式放行 DNS要素拆解
| 字段 | 作用 | 省略时的含义 |
|---|---|---|
| podSelector | 选中本策略管辖的 Pod,空选择器表示本命名空间全部 Pod | 不写等同于空选择器,管整个命名空间 |
| policyTypes | 声明本策略约束哪个方向 | 只写了 ingress 规则时默认按入向处理 |
| ingress.from | 允许哪些来源访问 | 规则里不写 from 表示允许所有来源 |
| ports | 限定协议与端口 | 不写 ports 表示该来源的所有端口都放行 |
| ipBlock 与 except | 按网段放行,可排除子网 | 只在需要放行集群外地址时使用 |
典型使用场景
- 东西向隔离:只允许前端访问后端指定端口,阻止同命名空间的其他 Pod 横向探测
- 数据面收敛:数据库只接受业务 Pod 的连接,出向与入向都收紧
- 出向治理:限制 Pod 只能访问指定服务与 DNS,降低被攻陷后的横向移动能力
- 跨命名空间放行:只允许监控命名空间抓取指标端口,其余来源一律不放行
- 灰度收敛:新策略先按观察模式验证标签匹配,确认无误再收紧端口范围
同一元素里的 namespaceSelector 与 podSelector 是 AND 关系,表示「该命名空间里带这个标签的 Pod」;把它们拆成两个并列元素则是 OR 关系,含义完全不同。这是写错策略最常见的地方,写完用实际 Pod 标签核对一遍。
策略是白名单叠加,一旦给某个 Pod 声明了某方向,该方向未被任何策略放行的流量都会被丢弃,包括 DNS 与健康检查。收紧出向前先确认客户端 Pod 的数量与标签,避免把运维通道一起关掉。