3、多租户架构基础:Kubernetes多租户模型

在GitOps多租户环境中,Kubernetes原生提供的隔离机制是构建故障定位与隔离策略的基石。本章深入剖析命名空间、RBAC、网络策略和资源配额四大核心组件,并展示它们如何协同工作以形成可观测、可管控的多租户边界。

3.1 命名空间:租户的逻辑边界

命名空间(Namespace)是Kubernetes多租户的第一道隔离层。它将集群内的资源划分为逻辑分组,每个租户拥有独立的命名空间,从而实现资源命名隔离和权限边界。

关键原则: 每个租户对应一个独立的命名空间,命名空间名称作为租户标识(如 tenant-alpha、tenant-beta)。集群级别资源(Node、PV、ClusterRole)不在命名空间内,需额外管控。
Kubernetes 多租户命名空间隔离模型 Kubernetes Cluster Namespace: tenant-alpha Deployments Services ConfigMaps Secrets ResourceQuota / LimitRange Namespace: tenant-beta Deployments Services ConfigMaps Secrets ResourceQuota / LimitRange 集群级别资源(Node、PV、ClusterRole)位于命名空间之外,需通过 RBAC 和准入控制额外保护

3.2 RBAC:细粒度权限控制

基于角色的访问控制(RBAC)决定了每个租户(或用户/服务账户)在各自命名空间内能执行的操作。在多租户场景中,RBAC 策略必须严格遵循最小权限原则。

3.2.1 核心 RBAC 对象

对象 作用域 用途
Role 命名空间 定义对特定命名空间内资源的操作权限(如 get pods、create deployments)
ClusterRole 集群 定义集群级别资源权限,或可被多个命名空间引用的通用权限模板
RoleBinding 命名空间 将 Role 或 ClusterRole 绑定到命名空间内的用户/组/服务账户
ClusterRoleBinding 集群 将 ClusterRole 绑定到集群级别的用户/组/服务账户

3.2.2 多租户 RBAC 最佳实践

  • 使用 ClusterRole 作为模板: 创建通用的 tenant-admin、tenant-developer、tenant-viewer 等 ClusterRole,然后通过 RoleBinding 在每个租户命名空间内绑定。
  • 服务账户隔离: 每个 GitOps Agent(如 ArgoCD Application Controller)在目标租户命名空间内使用独立的 ServiceAccount,并绑定最小权限 Role。
  • 避免集群级别绑定: 除非必要(如集群管理员),否则始终使用 RoleBinding 而非 ClusterRoleBinding,将权限限制在命名空间内。
排障提示: 当 GitOps 同步失败且错误信息包含 "Forbidden" 或 "Unauthorized" 时,优先检查目标命名空间内的 RoleBinding 是否引用了正确的 ClusterRole,以及 ServiceAccount 是否匹配。

3.3 网络策略:租户间流量隔离

默认情况下,Kubernetes 集群内所有 Pod 可以互相通信。网络策略(NetworkPolicy)通过标签选择器和规则定义,实现租户间的网络隔离,防止一个租户的异常流量影响其他租户。

3.3.1 网络策略隔离模型

网络策略隔离模型:默认拒绝 + 显式允许 Namespace: tenant-alpha Pod A1 app: frontend Pod A2 app: backend 允许 Namespace: tenant-beta Pod B1 app: web Pod B2 app: db 禁止跨租户 NetworkPolicy 规则 ingress: 允许来自 app=frontend egress: 仅允许到 app=backend NetworkPolicy 规则 ingress: 仅允许来自 app=web egress: 仅允许到 app=db

3.3.2 网络策略配置示例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-alpha-deny-all
  namespace: tenant-alpha
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-alpha-allow-frontend-to-backend
  namespace: tenant-alpha
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: db
    ports:
    - port: 5432
注意: 网络策略由 CNI 插件(如 Calico、Cilium)强制执行。如果集群未安装支持 NetworkPolicy 的 CNI,策略将不会生效。在 GitOps 排障时,需确认 CNI 类型及策略执行状态。

3.4 资源配额:防止资源争抢

资源配额(ResourceQuota)和限制范围(LimitRange)确保单个租户不会过度消耗集群资源,从而影响其他租户的稳定性。这是多租户故障隔离中“防止噪声邻居”的关键机制。

3.4.1 ResourceQuota 核心配置

资源类型 示例配置 说明
计算资源 requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
限制命名空间内所有 Pod 的 CPU/内存请求和上限总和
存储资源 requests.storage: "100Gi"
persistentvolumeclaims: "10"
限制 PVC 总容量和数量
对象数量 pods: "50"
services: "20"
secrets: "30"
限制命名空间内各类 Kubernetes 对象的最大数量

3.4.2 LimitRange 配置示例

apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-alpha-limits
  namespace: tenant-alpha
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "200m"
      memory: "512Mi"
    type: Container
排障要点: 当 GitOps 同步失败且 Pod 处于 Pending 状态时,使用 kubectl describe quota -n <namespace> 查看配额使用情况。如果配额已满,即使 GitOps 正确生成了 Deployment,调度器也无法创建 Pod。

3.5 多租户隔离策略对比

隔离维度 Kubernetes 机制 故障隔离能力 排障关注点
资源命名 命名空间 防止资源名称冲突 确认资源是否在正确的命名空间
权限控制 RBAC (Role/ClusterRole + Binding) 防止越权操作 检查 ServiceAccount 权限和 RoleBinding 绑定
网络流量 NetworkPolicy 防止跨租户网络攻击和流量泄露 验证 CNI 支持及策略规则是否生效
资源消耗 ResourceQuota + LimitRange 防止单个租户耗尽集群资源 监控配额使用率,检查 Pod 是否因配额不足而 Pending