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) |
tenant-id、tier、environment),便于后续使用标签选择器进行批量策略管理。
2.2 租户资源隔离模型
租户隔离模型由三个核心层次构成:命名空间隔离(Namespace)、权限隔离(RBAC)、网络隔离(NetworkPolicy)。三者协同工作,确保租户 A 无法访问或影响租户 B 的资源。
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
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
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 |