3. 多租户模型:租户隔离策略、命名空间隔离与资源配额管理

在多集群签名链路中,多租户模型是保障安全性与公平性的基石。每个租户(Tenant)对应一个独立的业务单元或组织,其签名请求、密钥材料、调用频率和故障域必须严格隔离。本章围绕三种核心隔离机制展开:租户隔离策略定义逻辑边界,命名空间隔离实现资源分组,资源配额管理确保服务质量。

3.1 租户隔离策略

租户隔离策略决定了签名链路中“谁可以访问什么”。在基于多集群的架构中,隔离策略通常分为三个层次:

隔离层次 隔离粒度 典型实现 适用场景
集群级隔离 物理/虚拟集群 专用集群、节点亲和性、PodAntiAffinity 金融核心、监管合规、高敏感签名
命名空间级隔离 Kubernetes Namespace NetworkPolicy、RBAC、ResourceQuota 多业务线共享集群、开发/测试/生产
应用级隔离 签名服务实例 Sidecar代理、mTLS、请求级认证 微服务间签名调用、API网关代理
关键原则:租户隔离策略应遵循“最小权限 + 故障半径最小化”。签名密钥的访问控制必须与网络策略联动,防止跨租户的密钥泄露或流量劫持。

3.2 命名空间隔离设计

命名空间(Namespace)是 Kubernetes 中实现多租户隔离的基本单元。在签名链路中,每个租户拥有独立的命名空间,包含签名服务、密钥存储、审计日志和配置映射。命名空间隔离的核心要素包括:

  • 网络隔离:通过 NetworkPolicy 限制跨命名空间的 Pod 通信,仅允许签名网关所在命名空间与租户命名空间建立连接。
  • 权限隔离:使用 RBAC(Role-Based Access Control)为每个租户绑定独立的 ServiceAccount,禁止跨命名空间的 Secret 读取。
  • 密钥隔离:签名私钥存储在租户命名空间的 Secret 或外部 KMS 中,通过命名空间标签实现密钥策略绑定。
  • 日志隔离:审计日志按命名空间分流,每个租户只能查询本命名空间的签名记录。
实践建议:命名空间名称采用统一编码规则,例如 sign-{tenant-id}-{env},便于自动化运维和故障排查。避免使用默认命名空间承载签名服务。
命名空间隔离架构图 命名空间隔离架构 签名网关命名空间 (sign-gateway) 租户 A 命名空间 (sign-tenant-a-prod) 签名服务 Pod 密钥管理 (KMS) 审计日志 配置映射 租户 B 命名空间 (sign-tenant-b-prod) 签名服务 Pod 密钥管理 (KMS) 审计日志 配置映射 说明:NetworkPolicy 仅允许 sign-gateway 命名空间访问租户命名空间的 8443 端口,禁止租户间互访。

3.3 资源配额管理

资源配额(ResourceQuota)防止单个租户的签名请求耗尽集群资源,导致其他租户签名超时或失败。在多集群签名链路中,资源配额管理需要覆盖以下维度:

资源类型 配额维度 典型限制值 超限处理策略
计算资源 CPU / 内存 4 CPU / 8Gi 内存 Pod 驱逐、请求排队
存储资源 持久卷声明 (PVC) 10Gi 总容量 签名日志滚动、拒绝新 PVC
对象数量 Pod / Secret / ConfigMap 50 Pod / 100 Secret 创建失败、审计告警
签名请求速率 QPS(每秒查询数) 1000 QPS 限流、降级、返回 429
注意:签名请求速率配额(QPS)是签名链路特有的配额维度。建议在网关层实现分布式限流,配合命名空间的 ResourceQuota 形成双层保护。仅依赖 Kubernetes ResourceQuota 无法精确控制应用层 QPS。

3.4 配额管理实现示例

以下是一个典型的命名空间资源配额 YAML 配置,适用于签名链路中的生产租户:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: sign-tenant-quota
  namespace: sign-tenant-a-prod
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    persistentvolumeclaims: "5"
    pods: "50"
    secrets: "100"
    configmaps: "50"
    count/signatures.tenant.example.com: "1000"  # 自定义签名请求配额
---
apiVersion: v1
kind: LimitRange
metadata:
  name: sign-tenant-limits
  namespace: sign-tenant-a-prod
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "0.5"
      memory: "512Mi"
    default:
      cpu: "1"
      memory: "2Gi"
    defaultRequest:
      cpu: "0.5"
      memory: "1Gi"
    type: Container
最佳实践:使用 LimitRange 配合 ResourceQuota,确保每个签名服务 Pod 的资源声明在合理范围内,避免单个 Pod 因资源申请过大导致配额快速耗尽。
资源配额与限流联动流程 资源配额与限流联动流程 签名请求到达 网关限流检查 (QPS) 返回 429 限流 超限 通过限流 通过 命名空间配额检查 执行签名并审计 说明:网关限流(应用层)先于命名空间配额(平台层)执行,避免无效请求消耗集群资源。

3.5 多集群场景下的配额同步

当签名链路跨多个 Kubernetes 集群时,资源配额管理面临新的挑战:

  • 配额一致性:同一租户在不同集群的配额配置应保持一致,避免因集群间配额差异导致签名路由倾斜。
  • 全局限流:租户的签名请求可能被路由到多个集群,需要全局 QPS 限流,而非仅依赖单集群配额。
  • 故障转移:当主集群资源耗尽时,签名请求应自动转移到备用集群,备用集群需预留足够的配额缓冲。
工程实践:使用 GitOps 工具(如 ArgoCD)管理多集群的 ResourceQuota 配置,通过 Operator 实现配额状态的全局监控和自动调整。当某个集群的租户配额使用率超过 80% 时,触发告警并自动扩容或路由切换。

3.6 隔离策略的故障恢复影响

良好的租户隔离策略直接影响故障恢复的效率和范围:

隔离维度 故障恢复优势 典型恢复操作
命名空间隔离 故障仅影响单个租户,不影响全局签名链路 重启租户命名空间内的 Pod,无需全局回滚
资源配额 防止资源耗尽导致级联故障 动态调整配额、驱逐非关键 Pod
网络隔离 故障不会通过网络扩散到其他租户 隔离故障租户的网络策略,保留其他租户服务
关键提醒:在故障恢复演练中,必须验证租户隔离边界是否被意外绕过。例如,检查 NetworkPolicy 是否在集群升级后仍然生效,RBAC 绑定是否因配置漂移而失效。建议每季度执行一次租户隔离的渗透测试。