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