2. 多租户基础:租户定义、租户资源隔离模型与配额管理

在多租户 Kubernetes 集群中,租户 是一个逻辑边界,代表一组共享同一资源隔离策略、访问控制规则和配额约束的工作负载或用户组。本章将系统定义租户模型,并深入讲解基于 Namespace、RBAC、NetworkPolicy 的三层隔离体系,以及如何通过 ResourceQuota 和 LimitRange 实现租户级的资源保障。

2.1 租户定义与模型

租户并非 Kubernetes 原生 API 对象,而是通过组合多个原生资源(Namespace、RBAC、NetworkPolicy、ResourceQuota)形成的逻辑抽象。在故障域隔离场景中,每个租户应被视为一个独立的故障单元,其资源分配、网络边界和权限体系均需与其它租户完全隔离。

租户属性 说明 对应 Kubernetes 资源
租户 ID 全局唯一标识,通常使用 UUID 或业务编码 Namespace 名称前缀(如 tenant-abc)
归属组织 租户所属的业务部门或客户 Namespace 标签(org: finance)
隔离级别 软隔离(共享集群)或硬隔离(专用节点池) Namespace + NodeSelector / Taint
资源配额 CPU、内存、存储、对象数量的上限 ResourceQuota + LimitRange
网络策略 入站/出站流量控制规则 NetworkPolicy
权限模型 租户管理员、开发者、只读用户等角色 RBAC(Role / RoleBinding)
最佳实践: 建议为每个租户创建独立的 Namespace,并在 Namespace 上附加统一的标签集(如 tenant-id、tier、environment),便于后续使用标签选择器进行批量策略管理。

2.2 租户资源隔离模型

租户隔离模型由三个核心层次构成:命名空间隔离(Namespace)、权限隔离(RBAC)、网络隔离(NetworkPolicy)。三者协同工作,确保租户 A 无法访问或影响租户 B 的资源。

租户隔离三层模型 第一层:命名空间隔离(Namespace) 每个租户拥有独立的 Namespace,资源名称不冲突 通过标签选择器实现租户级资源聚合与审计 第二层:权限隔离(RBAC) 租户管理员通过 Role 定义操作权限,RoleBinding 绑定用户/服务账号 禁止跨 Namespace 的资源访问,遵循最小权限原则 第三层:网络隔离(NetworkPolicy) 默认拒绝所有入站/出站流量,仅允许显式声明的 Pod 间通信 支持基于标签选择器、IP 段、端口级别的精细控制 三层隔离必须同时配置,缺一层即存在租户越权或数据泄露风险

2.2.1 Namespace 隔离

Namespace 是 Kubernetes 中最基础的隔离单元。每个租户独占一个 Namespace,所有工作负载(Deployment、Service、ConfigMap、Secret 等)均在该 Namespace 内创建。Namespace 级别的资源名称天然隔离,不同 Namespace 中允许存在同名的资源。

# 创建租户 Namespace 并附加标签
kubectl create namespace tenant-abc
kubectl label namespace tenant-abc tenant-id=abc-001 org=finance environment=prod

2.2.2 RBAC 权限隔离

RBAC 确保租户内的用户或服务账号只能操作本 Namespace 内的资源。通过 Role(角色)定义权限集合,再通过 RoleBinding(角色绑定)将角色授予特定主体。ClusterRole 和 ClusterRoleBinding 用于集群级权限,在多租户场景中应严格限制使用。

# 租户管理员角色定义
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: tenant-abc
  name: tenant-admin
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["pods", "deployments", "services", "configmaps", "secrets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
# 绑定用户到租户管理员角色
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: tenant-abc
  name: tenant-admin-binding
subjects:
- kind: User
  name: "alice@finance.com"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: tenant-admin
  apiGroup: rbac.authorization.k8s.io
安全警告: 禁止在集群级别使用 ClusterRoleBinding 将用户绑定到集群管理员角色。每个租户的权限必须限定在 Namespace 范围内,避免租户越权操作集群级资源(如 Node、PersistentVolume、ClusterRole)。

2.2.3 NetworkPolicy 网络隔离

NetworkPolicy 是 Kubernetes 中实现 Pod 级网络访问控制的资源。默认情况下,所有 Pod 可以互相通信;启用 NetworkPolicy 后,需要显式声明允许的流量规则。在多租户集群中,建议为每个租户配置默认拒绝策略,然后按需开放。

# 默认拒绝所有入站流量(适用于租户 Namespace)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: tenant-abc
spec:
  podSelector: {}
  policyTypes:
  - Ingress
---
# 允许同 Namespace 内 Pod 间通信
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-namespace
  namespace: tenant-abc
spec:
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: tenant-abc

2.3 租户配额管理

配额管理是防止单个租户过度消耗集群资源的关键机制。Kubernetes 提供 ResourceQuota 和 LimitRange 两个原生资源来实现租户级和容器级的资源约束。

2.3.1 ResourceQuota(资源配额)

ResourceQuota 作用于 Namespace 级别,限制该 Namespace 内所有 Pod 可使用的资源总量。支持对 CPU、内存、存储、以及对象数量(如 Pod、Service、ConfigMap 数量)进行限制。

# 租户资源配额示例
apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-abc
spec:
  hard:
    requests.cpu: "4"        # 所有 Pod 请求 CPU 总量不超过 4 核
    requests.memory: "8Gi"   # 所有 Pod 请求内存总量不超过 8Gi
    limits.cpu: "8"          # 所有 Pod 限制 CPU 总量不超过 8 核
    limits.memory: "16Gi"    # 所有 Pod 限制内存总量不超过 16Gi
    persistentvolumeclaims: "5"   # PVC 数量不超过 5 个
    pods: "20"               # 运行中 Pod 数量不超过 20 个
    services: "10"           # Service 数量不超过 10 个
    configmaps: "15"         # ConfigMap 数量不超过 15 个

2.3.2 LimitRange(范围限制)

LimitRange 在 Namespace 级别设置单个 Pod 或容器的资源默认值及上下限。它确保每个 Pod 都设置了合理的资源请求和限制,避免某个容器无限占用资源。

# 租户容器资源限制示例
apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-limits
  namespace: tenant-abc
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "200m"
      memory: "512Mi"
    type: Container
租户配额管理流程 1. 创建 Namespace 2. 设置 ResourceQuota 3. 设置 LimitRange 4. 验证配额生效 5. 监控与告警 配额冲突时,Kubernetes 会拒绝创建超出 ResourceQuota 的 Pod,并返回错误信息 建议结合 Prometheus + Alertmanager 监控配额使用率,设置 80% 告警阈值

2.4 租户隔离模型验证清单

在演练环境中,建议使用以下清单验证租户隔离是否生效:

验证项 预期结果 验证命令
Namespace 隔离 租户 A 无法查看租户 B 的 Pod kubectl get pods -n tenant-b --as=alice@finance.com
RBAC 权限 只读用户无法删除资源 kubectl delete pod test -n tenant-abc --as=bob@finance.com
NetworkPolicy 跨 Namespace 的 Pod 无法通信 在 Pod 内执行 curl <tenant-b-pod-ip>
ResourceQuota 超出配额时 Pod 创建失败 kubectl describe quota -n tenant-abc
LimitRange 未设置资源限制的 Pod 自动注入默认值 kubectl describe limitrange -n tenant-abc