2. Kubernetes 原生多租户模型:Namespace隔离、RBAC权限控制、ResourceQuota与LimitRange

Kubernetes 原生多租户模型不依赖第三方插件,而是通过四个核心原语构建:Namespace(资源隔离边界)、RBAC(身份与权限)、ResourceQuota(总量硬约束)和 LimitRange(单 Pod 软约束)。这四个组件组合使用,可以在一个集群内实现安全、可控的多租户环境。

2.1 四层隔离模型总览

下表总结了每个原语在租户隔离中的角色与生效范围:

原语 API 组/版本 作用范围 核心职责
Namespace core/v1 集群级 资源对象命名空间隔离,DNS 逻辑分区
RBAC rbac.authorization.k8s.io/v1 集群/命名空间 用户/ServiceAccount 对 API 资源的操作授权
ResourceQuota core/v1 命名空间 限制命名空间内资源总量(CPU/内存/存储/对象数)
LimitRange core/v1 命名空间 设置 Pod/Container 默认资源请求与限制,防止单个 Pod 异常占用
设计原则:Namespace 提供隔离边界,RBAC 控制谁能做什么,ResourceQuota 防止租户资源滥用,LimitRange 保证单个工作负载行为可预测。四者缺一不可。

2.2 Namespace:资源隔离的边界

Namespace 是 Kubernetes 多租户的第一道防线。它将集群内的资源(Pod、Service、ConfigMap、Secret 等)划分为逻辑组,每个租户拥有独立的命名空间。

  • DNS 隔离:Service 在命名空间内通过 svc-name.namespace-name.svc.cluster.local 访问,跨命名空间需显式指定。
  • 资源对象隔离:Pod、Deployment、Service 等资源在命名空间内唯一,不同命名空间可同名。
  • 网络策略配合:Namespace 本身不提供网络隔离,需配合 NetworkPolicy 实现南北向与东西向流量控制。
# 创建租户命名空间
kubectl create namespace tenant-alpha

# 查看命名空间内的资源隔离效果
kubectl get pods -n tenant-alpha
kubectl get pods -n tenant-beta   # 两个命名空间互不可见

2.3 RBAC:细粒度的权限控制

RBAC 通过 Role(命名空间级)和 ClusterRole(集群级)定义权限集合,再通过 RoleBinding 和 ClusterRoleBinding 将权限绑定到用户、组或 ServiceAccount。

RBAC 对象 作用域 典型用途
Role 单个 Namespace 租户管理员只能操作本命名空间资源
ClusterRole 整个集群 集群管理员、节点查看、PV 管理
RoleBinding 单个 Namespace 将 Role 绑定给租户用户
ClusterRoleBinding 整个集群 将 ClusterRole 绑定给全局用户
# 创建租户只读 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: tenant-alpha
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
---
# 绑定给用户 alice
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: tenant-alpha
  name: alice-pod-reader
subjects:
- kind: User
  name: alice
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
常见陷阱:不要将 ClusterRole 直接绑定给租户用户,除非需要跨命名空间操作。始终优先使用 Role + RoleBinding,将权限限制在租户自己的命名空间内。

2.4 ResourceQuota:命名空间资源硬约束

ResourceQuota 为命名空间设置资源使用上限,防止单个租户耗尽集群资源。支持对 CPU、内存、存储、PVC 数量、Service 数量等 20+ 种资源进行限制。

# 为 tenant-alpha 设置资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-alpha
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    persistentvolumeclaims: "5"
    pods: "20"
    services: "10"
    configmaps: "10"

当命名空间内资源使用达到配额上限时,Kubernetes API Server 会拒绝后续创建请求,并返回 403 Forbidden 错误。

2.5 LimitRange:单 Pod 资源行为约束

LimitRange 在命名空间级别设置 Pod 和 Container 的默认资源请求/限制,以及最小/最大值。它确保租户内的每个工作负载都遵循合理的资源规格,避免单个 Pod 因未设置资源限制而抢占所有节点资源。

# 为 tenant-alpha 设置默认资源限制
apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-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
关键行为:如果 Pod 未设置 resources.requests 或 resources.limits,LimitRange 会自动注入默认值。如果 Pod 的请求或限制超出 max/min 范围,API Server 会拒绝创建。

2.6 四层模型协同工作流程

下图展示了当租户用户向 API Server 提交 Pod 创建请求时,四个原语的协同校验顺序:

Kubernetes 原生多租户四层校验流程 租户用户提交 Pod 创建请求 ① Namespace 存在性校验 ② RBAC 权限校验 ③ ResourceQuota 总量校验 ④ LimitRange 单 Pod 约束校验 校验说明 ① 目标 Namespace 必须存在 ② 用户/SA 必须有 create pods 权限 ③ 命名空间资源总量未超配额 ④ Pod 资源规格在 LimitRange 范围内 任意一步失败 → 请求被拒绝 全部通过 → Pod 进入调度队列

2.7 多租户配置最佳实践清单

  1. 命名空间命名规范:使用 tenant-{name} 或 {env}-{team} 格式,便于 RBAC 策略批量匹配。
  2. RBAC 最小权限:每个租户只授予其命名空间内的必要操作权限,避免使用 cluster-admin 或 * 通配符。
  3. ResourceQuota 预留缓冲:配额上限设置为集群容量的 70%~80%,为系统组件和突发流量留出余量。
  4. LimitRange 默认值:始终为每个命名空间配置 LimitRange,防止未设置资源限制的 Pod 导致节点过载。
  5. 定期审计:使用 kubectl describe quota -n {ns} 和 kubectl describe limitrange -n {ns} 监控资源使用情况。
生产建议:对于严格隔离场景,建议结合 NetworkPolicy(网络隔离)、PodSecurityAdmission(安全上下文)和 OPA/Gatekeeper(策略引擎)增强多租户安全性。Kubernetes 原生四层模型是基础,但不是全部。