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 限制每个命名空间的代理可见性。
SaaS vs PaaS 租户隔离模型对比 SaaS 模型(强隔离) 租户 A ns: tenant-a 租户 B ns: tenant-b 独立 Istio 策略 独立 Istio 策略 独立数据存储 独立数据存储 X PaaS 模型(软隔离) 项目 Alpha ns: alpha-* 项目 Beta ns: beta-* 共享 Istio 控制面(istiod) 共享资源池 共享资源池 ✓ SaaS 强调数据与策略完全隔离;PaaS 强调资源共享与策略可控

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 区分关键业务。
资源配额管理架构 Kubernetes 集群 租户 A 命名空间 ResourceQuota LimitRange Sidecar 资源: CPU 200m / Mem 256Mi Pod 上限: 50 | 服务上限: 20 租户 B 命名空间 ResourceQuota LimitRange Sidecar 资源: CPU 500m / Mem 512Mi Pod 上限: 100 | 服务上限: 50 隔离 每个租户独立配置 ResourceQuota + LimitRange,Sidecar 资源按租户负载差异化分配

2.4 隔离模型选择决策树

在实际项目中,选择 SaaS 还是 PaaS 隔离模型,需要根据业务需求、安全合规和运维成本综合判断。以下决策树可以帮助快速定位:

  1. 是否需要数据层完全隔离? 是 → SaaS 模型;否 → 进入下一步。
  2. 租户之间是否允许共享服务? 是 → PaaS 模型;否 → SaaS 模型。
  3. 是否有合规审计要求(如金融、医疗)? 是 → SaaS 模型 + 独立命名空间 + 独立 Istio 控制面。
  4. 运维团队规模是否有限? 是 → PaaS 模型 + 共享控制面 + 自动化策略注入。
总结: 命名空间隔离是 Istio 多租户的基础,资源配额管理是保障稳定性的底线。SaaS 模型适合对外服务、强合规场景;PaaS 模型适合内部平台、快速迭代场景。无论选择哪种模型,都需要通过 AuthorizationPolicy、Sidecar 和 ResourceQuota 三层防线确保租户间的安全与资源公平。