3、租户隔离模型设计:Namespace隔离、RBAC隔离、资源配额隔离
在基于 Resource Model 的租户隔离升级场景中,隔离模型的设计直接决定了故障半径和运维效率。本章聚焦三层核心隔离机制:Namespace 隔离(资源边界)、RBAC 隔离(权限边界)、资源配额隔离(容量边界)。三者共同构成“物理-逻辑-策略”的纵深防御体系。
3.1 三层隔离模型总览
下表对比了三层隔离的职责、作用对象和典型故障场景:
| 隔离层 | 核心职责 | 作用对象 | 升级故障典型表现 |
|---|---|---|---|
| Namespace 隔离 | 资源命名空间与网络边界 | Pod、Service、ConfigMap | 跨 Namespace 服务发现失败、DNS 解析超时 |
| RBAC 隔离 | 操作权限与角色绑定 | User、ServiceAccount、Role | 升级后 API 调用返回 403、控制器无法 List/Watch |
| 资源配额隔离 | 资源上限与抢占控制 | CPU、Memory、存储、对象计数 | Pod 调度失败、ResourceQuota 冲突、LimitRange 拒绝 |
设计原则:三层隔离必须独立配置但协同生效。升级过程中,任意一层被绕过或配置遗漏,都会导致租户数据泄露或服务中断。
3.2 Namespace 隔离:资源边界
Namespace 是 Kubernetes 中最基础的隔离单元。在 Resource Model 中,每个租户对应一个或多个 Namespace,通过 NetworkPolicy 实现网络隔离,通过 ResourceQuota 实现容量隔离。
升级故障排查要点:
- DNS 解析域变更:升级后 CoreDNS 配置可能重置,导致
<service>.<namespace>.svc.cluster.local解析失败。 - NetworkPolicy 未迁移:旧版本 NetworkPolicy 的 podSelector 或 namespaceSelector 在新版本中语义变化,导致流量被意外阻断。
- Namespace 标签丢失:升级过程中 Namespace 的 label 被清除,影响基于标签的 RBAC 和 NetworkPolicy 匹配。
故障案例:某金融租户升级后,跨 Namespace 的 gRPC 调用全部超时。排查发现 CoreDNS 升级后未加载租户自定义域名映射,导致
svc.cluster.local 解析指向错误 IP。
3.3 RBAC 隔离:权限边界
RBAC 控制每个主体(User、Group、ServiceAccount)对资源的操作权限。在升级场景中,RBAC 隔离的常见故障包括:
- Role 与 ClusterRole 混淆:升级后控制器使用的 ClusterRole 被重置为默认值,导致跨 Namespace 的 List/Watch 权限丢失。
- Subject 变更:ServiceAccount 的 namespace 或 name 在升级过程中被修改,导致 RoleBinding 失效。
- API 组版本升级:旧版 RBAC 规则引用的 API 组(如
extensions/v1beta1)在新版本中被移除,导致权限检查失败。
升级前必检:使用
kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa> 验证每个租户 ServiceAccount 的权限集合,确保升级后权限不降级。
3.4 资源配额隔离:容量边界
ResourceQuota 和 LimitRange 共同保障租户的资源使用上限。升级过程中配额隔离的典型问题:
- 配额对象计数变更:新版本 Kubernetes 增加了新的计费对象(如
count/ingresses.extensions),旧配额未包含导致创建失败。 - LimitRange 默认值冲突:升级后 LimitRange 的默认 request/limit 与 Pod 的 QoS 策略冲突,导致 Pod 被拒绝。
- 资源单位精度变化:CPU 从
millicores到cores的转换误差,导致配额计算溢出。
3.5 三层隔离的协同故障排查矩阵
当升级后出现租户隔离故障时,建议按以下矩阵进行分层排查:
| 故障现象 | Namespace 层 | RBAC 层 | 资源配额层 |
|---|---|---|---|
| Pod 无法跨 Namespace 通信 | 检查 NetworkPolicy 和 DNS | 检查 ServiceAccount 权限 | 无需排查 |
| API 返回 403 Forbidden | 检查 Namespace 标签 | 检查 RoleBinding 和 ClusterRole | 无需排查 |
| Pod 调度失败 Pending | 检查 Namespace 是否存在 | 检查 ServiceAccount 是否存在 | 检查 ResourceQuota 和 LimitRange |
| 控制器无法 List 资源 | 检查 Namespace 是否被删除 | 检查 ClusterRole 的 API 组版本 | 检查对象计数配额 |
最佳实践:在升级前使用
kubectl diff 对比新旧版本的 RBAC 规则和 ResourceQuota 配置,生成“隔离配置差异报告”。升级后立即执行租户隔离验证脚本,覆盖 DNS 解析、权限校验、配额边界三个维度。