配置 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 端口的规则,否则服务发现会失败。
怎么验证是否生效
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 中使用网络策略