首页/云/云与容器速查/NetworkPolicy 网络策略
Kubernetes68 条

NetworkPolicy 网络策略

Pod 级防火墙:默认全通,可改为默认拒绝再逐条放行。策略是『允许列表』语义;需要 CNI 支持(Calico/Cilium 等),Flannel 单独不生效。

云与容器速查云更新于 2026-10-13

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 默认允许所有流量:隔离效果来自“被选中”,不是来自集群里存在策略对象。
上策略前先在测试环境验证:写错会把整片服务互相隔离不通,症状通常表现为超时,排查成本很高。

易错点

  • CNI 不支持策略:对象能创建但完全不生效,误以为已经完成隔离
  • 只做入向拒绝忘了放行 DNS 出向:解析全部失败,服务表现为启动超时
  • 选择器标签与业务实际标签不一致:策略选中了错误对象或没有选中任何对象
  • 策略写完后不做连通性验证:故障在发布时才暴露,回滚范围大
  • 把 NetworkPolicy 当跨集群隔离手段:它只作用于同一集群内的 Pod 流量

数据来源与参考

  • Kubernetes Docs:Network Policies

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌