2、多租户基础:租户隔离模型(SaaS vs PaaS)、命名空间隔离策略、资源配额管理
2.1 租户隔离模型:SaaS 与 PaaS 的核心差异
在云原生架构中,多租户(Multi-Tenancy)是指单个软件实例或平台实例为多个独立用户群体(租户)提供服务的能力。租户隔离模型的选择直接决定了 Istio 控制面与数据面的配置策略。根据服务交付模式,主要分为 SaaS(Software as a Service) 和 PaaS(Platform as a Service) 两种隔离模型。
关键概念: 租户 ≠ 用户。租户是一个逻辑隔离单元,拥有独立的身份、配置、策略和数据视图;用户是租户下的操作实体。
| 维度 | SaaS 隔离模型 | PaaS 隔离模型 |
|---|---|---|
| 租户粒度 | 业务租户(如企业 A、企业 B) | 项目/团队租户(如 dev-team、ai-team) |
| 隔离层级 | 应用层 + 数据层强隔离 | 平台层 + 资源层软隔离 |
| Istio 映射 | 每个租户独占一个或多个命名空间,使用独立的 Sidecar 配置 | 共享控制面,通过 AuthorizationPolicy 和 ServiceEntry 做策略隔离 |
| 网络策略 | 默认禁止跨租户通信,仅允许显式出口 | 允许同项目内通信,跨项目需显式授权 |
| 典型场景 | 金融 SaaS、CRM 系统 | 内部开发者平台、AI 训练平台 |
架构建议: 在 Istio 中,SaaS 模型推荐使用
meshConfig.accessLogFile 为每个租户开启独立访问日志;PaaS 模型则更依赖 Sidecar CRD 限制每个命名空间的代理可见性。
2.2 命名空间隔离策略
Kubernetes 命名空间(Namespace)是 Istio 多租户隔离的基本单元。通过合理的命名空间设计,结合 Istio 的 Sidecar、AuthorizationPolicy 和 PeerAuthentication 资源,可以实现不同粒度的租户隔离。
2.2.1 命名空间设计模式
- 按租户划分: 每个租户独占一个命名空间,命名空间名称包含租户标识(如
tenant-a-prod)。 - 按环境划分: 同一租户下按环境拆分命名空间(如
tenant-a-dev、tenant-a-staging)。 - 按功能划分: 在 PaaS 模型中,按业务功能或团队划分命名空间(如
data-platform、ml-training)。
2.2.2 隔离策略配置清单
| 策略类型 | Istio 资源 | 隔离效果 | 配置示例 |
|---|---|---|---|
| 网络隔离 | AuthorizationPolicy |
禁止/允许特定命名空间之间的流量 | action: DENY; from: namespace: ["evil-ns"] |
| 服务可见性 | Sidecar CRD |
限制 Sidecar 代理能发现的服务范围 | egress.hosts: ["ns1/*", "ns2/*"] |
| mTLS 隔离 | PeerAuthentication |
强制/禁用命名空间内的双向 TLS | mode: STRICT |
| 出口控制 | ServiceEntry + VirtualService |
控制租户对外部服务的访问 | hosts: ["external-api.com"] |
常见陷阱: 仅靠命名空间名称前缀无法实现隔离。必须配合 Istio 的
AuthorizationPolicy 显式声明跨命名空间的流量规则,否则默认情况下所有命名空间之间可以互相通信。
2.2.3 命名空间隔离策略示例
# 禁止命名空间 tenant-b 访问 tenant-a 的服务
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-tenant-b
namespace: tenant-a
spec:
action: DENY
rules:
- from:
- source:
namespaces: ["tenant-b"]
to:
- operation:
methods: ["*"]
# 限制 tenant-a 命名空间内的 Sidecar 只能发现本命名空间的服务
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: restrict-sidecar
namespace: tenant-a
spec:
egress:
- hosts:
- "tenant-a/*"
2.3 资源配额管理
资源配额管理确保每个租户不会过度消耗集群资源,影响其他租户的稳定性。在 Istio 多租户环境中,资源配额分为两个层面:Kubernetes 原生资源配额 和 Istio 代理资源配额。
2.3.1 Kubernetes 资源配额(ResourceQuota)
通过 ResourceQuota 对象限制每个命名空间的 CPU、内存、Pod 数量等资源上限。
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-a-quota
namespace: tenant-a
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
pods: "50"
services: "20"
2.3.2 Istio 代理资源配额
Sidecar 代理(Envoy)本身也会消耗资源。需要为每个租户的 Sidecar 设置合理的资源请求和限制,避免代理成为性能瓶颈。
| 资源项 | 推荐值(轻量) | 推荐值(高负载) | 说明 |
|---|---|---|---|
| CPU 请求 | 100m | 500m | Sidecar 初始 CPU 分配 |
| CPU 限制 | 500m | 2000m | 突发流量时的 CPU 上限 |
| 内存请求 | 128Mi | 512Mi | Sidecar 初始内存分配 |
| 内存限制 | 512Mi | 1024Mi | 防止 OOM 的关键阈值 |
| 连接数 | 1000 | 5000 | Envoy 连接池上限 |
2.3.3 全局配额与租户配额联动
在大型集群中,建议使用 LimitRange 设置命名空间级别的默认资源约束,再结合 ResourceQuota 做总量控制。Istio 的 MeshConfig 中可以配置全局的 Sidecar 默认资源,但每个租户可以通过 PodAnnotation 覆盖。
# 在 MeshConfig 中设置全局 Sidecar 默认资源
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
concurrency: 2
# 全局 Sidecar 资源默认值
proxyResources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
最佳实践: 在 SaaS 模型中,为每个租户命名空间创建独立的
ResourceQuota 和 LimitRange;在 PaaS 模型中,可以按项目组共享一个较大的配额池,但通过 PriorityClass 区分关键业务。
2.4 隔离模型选择决策树
在实际项目中,选择 SaaS 还是 PaaS 隔离模型,需要根据业务需求、安全合规和运维成本综合判断。以下决策树可以帮助快速定位:
- 是否需要数据层完全隔离? 是 → SaaS 模型;否 → 进入下一步。
- 租户之间是否允许共享服务? 是 → PaaS 模型;否 → SaaS 模型。
- 是否有合规审计要求(如金融、医疗)? 是 → SaaS 模型 + 独立命名空间 + 独立 Istio 控制面。
- 运维团队规模是否有限? 是 → PaaS 模型 + 共享控制面 + 自动化策略注入。
总结: 命名空间隔离是 Istio 多租户的基础,资源配额管理是保障稳定性的底线。SaaS 模型适合对外服务、强合规场景;PaaS 模型适合内部平台、快速迭代场景。无论选择哪种模型,都需要通过
AuthorizationPolicy、Sidecar 和 ResourceQuota 三层防线确保租户间的安全与资源公平。