多租户NetPolicy策略配置与性能调优实战 - 第1节
1.1 多租户概念与网络隔离需求
1.1.1 什么是多租户
多租户(Multi-Tenancy)是一种软件架构模式,指单个平台实例同时服务多个独立用户群体(租户),每个租户在逻辑上彼此隔离。在 Kubernetes 环境中,租户通常对应一个团队、一个项目、一个业务线或一个客户。
| 维度 | 单租户 | 多租户 |
|---|---|---|
| 资源归属 | 所有资源属于同一用户 | 资源按租户划分,互不干扰 |
| 隔离粒度 | 无隔离需求 | 网络、存储、计算、身份均需隔离 |
| 运维复杂度 | 低 | 高,需策略编排与审计 |
| 资源利用率 | 可能闲置 | 共享基础设施,利用率高 |
1.1.2 网络隔离的核心需求
多租户场景下,网络隔离是安全基座。不同租户的工作负载必须满足以下要求:
- 禁止跨租户直接通信:租户 A 的 Pod 默认不能访问租户 B 的 Pod。
- 允许租户内部自由通信:同一租户内的服务可以互相调用。
- 支持白名单例外:如共享监控、日志采集、API 网关等基础设施需要跨租户访问。
- 隔离控制面与数据面:网络策略不影响控制面组件(如 kube-dns、metrics-server)。
实践要点: 网络隔离不应依赖物理网络或 VLAN 硬切分,而应通过 Kubernetes NetworkPolicy 在软件层面实现动态、细粒度的租户边界。
1.2 Kubernetes 网络模型概述
1.2.1 三大基础原则
Kubernetes 网络模型定义了四个关键约束,所有 CNI 插件都必须遵守:
- Pod 间无需 NAT 直接通信:每个 Pod 拥有独立 IP,跨 Node 的 Pod 通信不经过地址转换。
- Node 与 Pod 间直接通信:节点上的 kubelet 可以直接访问 Pod IP。
- Pod 内容器共享网络栈:同一 Pod 内的多个容器通过 localhost 通信,端口不冲突。
- Service 抽象层:ClusterIP 实现稳定的虚拟 IP,负载均衡到后端 Pod。
1.2.2 网络策略(NetworkPolicy)的角色
NetworkPolicy 是 Kubernetes 原生的防火墙规则,工作在 L3/L4 层,通过标签选择器定义哪些 Pod 可以互相通信。它不依赖底层 CNI 实现,但需要 CNI 插件(如 Calico、Cilium、Weave)支持。
关键认知: NetworkPolicy 是“白名单”模型——未显式允许的流量默认被拒绝。多租户隔离正是利用这一特性,为每个租户创建独立的隔离策略。
1.3 多租户网络隔离架构图
1.4 多租户网络策略设计模式
1.4.1 基于 Namespace 的租户隔离
最常用的多租户模式是将每个租户映射到一个独立的 Namespace。通过 NetworkPolicy 实现以下规则:
- 默认拒绝所有入站流量:防止外部 Pod 访问。
- 允许同 Namespace 内所有 Pod 通信:保证租户内部服务发现正常。
- 显式允许基础设施 Namespace 的入站:如 monitoring、ingress-nginx。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-isolation
namespace: tenant-a
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: tenant-a
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: infrastructure
1.4.2 基于标签的细粒度隔离
当租户内部需要进一步划分(如开发环境 vs 生产环境),可以使用 Pod 标签实现更精细的控制:
- 环境隔离:只允许相同环境标签的 Pod 通信。
- 分层隔离:前端 Pod 只能访问后端 Pod,不能直接访问数据库。
性能注意事项: 每个 Namespace 中 NetworkPolicy 对象数量建议控制在 50 个以内。过多的策略规则会导致 CNI 插件 iptables 或 eBPF 规则膨胀,增加数据路径延迟。在 1000+ Pod 规模的集群中,策略匹配延迟可能从微秒级上升到毫秒级。
1.5 多租户网络模型对比
| 模型 | 隔离粒度 | 策略复杂度 | 性能影响 | 适用场景 |
|---|---|---|---|---|
| Namespace 级隔离 | 粗粒度(整个 Namespace) | 低 | 极小 | 团队/项目隔离 |
| 标签级隔离 | 细粒度(Pod 标签) | 中 | 低 | 环境/分层隔离 |
| IP 级隔离 | 最细粒度(单个 Pod IP) | 高 | 中 | 安全合规要求严格 |
| Service Mesh 隔离 | L7 应用层 | 高 | 中高 | 微服务多租户 |
1.6 多租户网络策略设计原则
- 最小权限原则:默认拒绝所有流量,仅显式放行必要通信。
- 策略分层:基础设施层 → 租户层 → 应用层,逐层细化。
- 可审计性:所有策略变更通过 GitOps 或策略引擎记录。
- 性能优先:优先使用 Namespace 选择器,避免大量 Pod 选择器规则。
- 避免策略冲突:同一 Pod 被多个 NetworkPolicy 选中时,规则取并集,需提前规划策略层级。
本章小结: 多租户网络隔离的核心是“默认拒绝 + 显式放行”。Kubernetes NetworkPolicy 提供了声明式、可扩展的隔离能力,但需要结合 Namespace 设计、标签体系和 CNI 插件特性才能在生产环境中达到性能与安全的平衡。下一章将深入 NetworkPolicy 的语法与匹配规则。