怎么配置 NetworkPolicy 限制命名空间之间的网络访问

文章导读
配置 NetworkPolicy 限制命名空间间访问,核心是在目标命名空间应用包含 namespaceSelector 的策略,默认拒绝所有跨命名空间流量,仅放行同命名空间或特定标签的流量。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

配置 NetworkPolicy 限制命名空间间访问,核心是在目标命名空间应用包含 namespaceSelector 的策略,默认拒绝所有跨命名空间流量,仅放行同命名空间或特定标签的流量。

先说结论:这是实现多租户隔离的标准做法,但依赖网络插件支持,默认情况下 Kubernetes 允许所有 Pod 自由通信。

  • 适合:多租户集群隔离、安全合规要求高的场景
  • 先准备:确认集群 CNI 插件支持 NetworkPolicy(如 Calico、Cilium、Terway)
  • 验收:通过 curl 测试跨命名空间连通性,确保策略生效且不影响 DNS

命令速用版

以下 YAML 可部署到目标命名空间,拒绝所有跨命名空间入站流量,仅允许同命名空间内通信:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-namespace
  namespace: app-ns
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector: {}

应用命令:

kubectl apply -f deny-cross-namespace.yaml

为什么会这样

Kubernetes 默认网络模型是扁平的,所有 Pod 无需 NAT 即可互相访问,包括跨命名空间。NetworkPolicy 相当于应用层防火墙,通过标签选择器控制流量。如果未安装支持该功能的 CNI 插件(如 Flannel 默认不支持),策略不会生效。

分步处理

1. 确认网络插件:执行 kubectl get pods -n kube-system 查看 CNI 组件,Calico、Cilium、Terway 均支持,Flannel 需搭配其他插件。

2. 创建测试命名空间:若需验证,先创建两个命名空间,例如 app-ns 和 test-ns。

3. 应用策略:将上述 YAML 中的 namespace 改为目标命名空间,执行 apply。

4. 放行 DNS:若设置了默认拒绝策略,需额外添加允许 kube-system 命名空间 UDP 53 端口的规则,否则服务发现会失败。

怎么配置 NetworkPolicy 限制命名空间之间的网络访问

怎么验证是否生效

1. 查看策略状态:kubectl get networkpolicy -n <namespace>,确认策略存在。

2. 连通性测试:在 test-ns 的 Pod 中 curl app-ns 的 Pod IP 或 Service 域名,预期连接超时或被拒绝。

3. 同命名空间测试:在 app-ns 内部 Pod 互访,预期正常通。

4. 日志排查:若使用 Calico 或 Terway,可查看节点上的 iptables 链(如 KUBE-NWPLCY)确认规则是否下发。

常见坑

1. 插件不支持:Flannel 默认不支持 NetworkPolicy,需更换或叠加插件。

2. DNS 中断:默认拒绝所有 Egress 会导致无法解析域名,需显式允许 kube-system 的 DNS 流量。

3. 策略数量限制:在大规模集群中,过多策略会影响管控性能,建议单个集群网络策略数量控制在合理范围(如阿里云 ACK 建议小于 100 个)。

4. 安全容器限制:部分安全容器运行时(如 Kata)可能不支持 NetworkPolicy。

参考来源

  • 阿里云帮助中心 - 容器服务 Kubernetes 版 ACK - 服务间网络流量的访问控制和传输过程中的流量加密
  • 阿里云帮助中心 - 容器服务 Kubernetes 版 ACK - 网络策略配置方法与应用场景
  • K8s 集群网络策略 (NetworkPolicy) 实战:拒绝跨命名空间访问,实现 Pod 间通信隔离
  • Kubernetes 网络策略详解与 Pod 间访问限制
  • 如何在 K3s 中使用网络策略