NetworkPolicy 是什么
NetworkPolicy 是 Pod 级别的防火墙规则:默认情况下集群内所有 Pod 之间可以互相访问,一旦某个 Pod 被策略选中,它的相关方向就变成“只允许显式放行的流量”。策略是允许列表语义,写不出“拒绝某条”这种规则,因此设计上通常先建立默认拒绝,再按业务逐条放行。它需要 CNI 插件实现策略能力,插件不支持时对象能创建成功但完全不生效,这一点最容易造成“以为已经隔离”的错觉。
基本信息
| 语义 | 只声明允许;未匹配到的流量按默认拒绝处理 |
|---|---|
| 方向 | Ingress 入向、Egress 出向,可分别或同时声明 |
| 选择器 | podSelector 选目标 Pod,from/to 选来源或目的(Pod、命名空间或网段) |
| 作用域 | 命名空间级对象,只影响本命名空间内被选中的 Pod |
| 前置条件 | CNI 插件需实现策略(Calico、Cilium 等),基础插件通常不支持 |
| 查看 | kubectl describe networkpolicy 与 kubectl get netpol -o yaml 核对选择器 |
典型使用场景
- 把数据库 Pod 限制为只接受应用层的访问,其他 Pod 一律不可达
- 命名空间之间做隔离:默认拒绝跨命名空间流量,再按需放行
- 限制出向访问:只允许访问内部服务与 DNS,减少数据外送风险
- 合规要求网络分区时,用策略把不同业务域隔开
- 配合 Ingress 控制器只放行来自控制器命名空间的流量
默认拒绝与放行示例
默认拒绝与放行示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: web-allow
namespace: dev
spec:
podSelector:
matchLabels: { app: web } # 策略作用于带该标签的 Pod
policyTypes: ["Ingress"] # 只约束入向
ingress:
- from:
- podSelector:
matchLabels: { app: frontend } # 只允许带 frontend 标签的 Pod 访问
ports:
- protocol: TCP
port: 8080 # 只放行 8080关键字段读法
| 字段 | 含义 | 注意 |
|---|---|---|
| podSelector | 策略作用的目标 Pod | 空选择器表示命名空间内全部 Pod |
| policyTypes | 约束哪些方向 | 写了 Egress 规则必须列出 Egress |
| from/to | 允许的来源或目的 | 可组合 Pod 与命名空间选择器 |
| ports | 放行的端口与协议 | 不写表示该方向全部端口 |
| ipBlock | 按网段放行 | 适合放行外部固定地址 |
没有策略选中的 Pod 默认允许所有流量:隔离效果来自“被选中”,不是来自集群里存在策略对象。
上策略前先在测试环境验证:写错会把整片服务互相隔离不通,症状通常表现为超时,排查成本很高。