2. Kubernetes Namespace 与 RBAC:多租户隔离的基石
在多租户集群中,Namespace 提供逻辑上的资源隔离边界,而 RBAC(基于角色的访问控制) 则定义谁能在这些边界内执行哪些操作。两者结合,构成了 Kubernetes 多租户隔离的第一道防线。
2.1 Namespace:逻辑隔离单元
Namespace 将集群内的资源划分为互不干扰的虚拟分组。每个 Namespace 拥有独立的资源配额、网络策略和权限控制,但底层共享同一个物理集群。
2.1.1 核心隔离能力
| 隔离维度 | 实现机制 | 典型场景 |
|---|---|---|
| 资源配额 | ResourceQuota + LimitRange | 限制租户 CPU/内存/存储上限 |
| 网络隔离 | NetworkPolicy(需 CNI 支持) | 禁止跨 Namespace 非授权访问 |
| 权限隔离 | RBAC + RoleBinding | 租户管理员只能管理本 Namespace |
| 对象命名 | Namespace 作用域 | 不同租户可创建同名 Service |
2.1.2 创建与使用
# 创建 Namespace
kubectl create namespace tenant-alpha
# 在 Namespace 中部署资源
kubectl run nginx --image=nginx -n tenant-alpha
# 查看 Namespace 资源配额
kubectl get resourcequota -n tenant-alpha
最佳实践: 使用
kubens 工具快速切换 Namespace 上下文,避免频繁使用 -n 参数。
2.2 RBAC 权限模型:谁能在 Namespace 内做什么
RBAC 通过四个核心对象定义权限:Subject(谁)、Resource(什么资源)、Verb(什么操作)、Role/ClusterRole(权限集合)。
2.2.1 核心概念对比
| 对象 | 作用域 | 绑定对象 | 典型用途 |
|---|---|---|---|
| Role | 单个 Namespace | RoleBinding | 租户只读、开发者编辑 |
| ClusterRole | 整个集群 | ClusterRoleBinding / RoleBinding | 集群管理员、PV 管理、节点查看 |
| RoleBinding | 单个 Namespace | 绑定 Role 到 User/Group/SA | 授予租户本 Namespace 权限 |
| ClusterRoleBinding | 整个集群 | 绑定 ClusterRole 到 User/Group/SA | 授予集群管理员权限 |
2.2.2 权限绑定流程
- 定义 Role:声明对哪些资源拥有哪些操作权限。
- 创建 Subject:确定用户、用户组或 ServiceAccount。
- 建立绑定:通过 RoleBinding 或 ClusterRoleBinding 将 Role 赋予 Subject。
- 验证权限:使用
kubectl auth can-i检查。
# 1. 创建 Namespace 只读 Role
kubectl create role namespace-reader --verb=get,list,watch --resource=pods,services -n tenant-alpha
# 2. 创建 ServiceAccount
kubectl create serviceaccount tenant-user -n tenant-alpha
# 3. 绑定 Role 到 ServiceAccount
kubectl create rolebinding tenant-reader-binding --role=namespace-reader --serviceaccount=tenant-alpha:tenant-user -n tenant-alpha
# 4. 验证权限
kubectl auth can-i list pods --as=system:serviceaccount:tenant-alpha:tenant-user -n tenant-alpha
2.3 多租户 RBAC 架构设计
生产级多租户集群通常采用 分层 RBAC 模型:集群级 ClusterRole 管理基础设施,Namespace 级 Role 管理租户资源。
2.4 实战:为租户配置最小权限
遵循 最小权限原则,每个租户只获得完成工作所需的最小权限集。
2.4.1 租户管理员权限模板
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: tenant-alpha
name: tenant-admin
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets", "persistentvolumeclaims"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["autoscaling"]
resources: ["horizontalpodautoscalers"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: tenant-alpha
name: tenant-admin-binding
subjects:
- kind: ServiceAccount
name: alpha-admin-sa
namespace: tenant-alpha
roleRef:
kind: Role
name: tenant-admin
apiGroup: rbac.authorization.k8s.io
2.4.2 权限粒度对照表
| 角色 | 可操作资源 | 允许的动词 | 禁止的操作 |
|---|---|---|---|
| 只读审计 | pods, services, events | get, list, watch | create, update, delete |
| 应用开发者 | pods, deployments, configmaps | get, list, watch, create, update | delete, 修改 ResourceQuota |
| 租户管理员 | 本 Namespace 全部资源 | 全部动词 | 跨 Namespace 操作、集群级资源 |
| 集群管理员 | 集群级资源(nodes, PV, CRD) | 全部动词 | 无(需审计) |
2.5 常见陷阱与避坑指南
⚠️ 权限扩散风险: 避免将 ClusterRole 通过 RoleBinding 绑定到非管理员用户。例如,将
cluster-admin ClusterRole 绑定到租户 ServiceAccount,会导致该租户拥有整个集群的管理权限。
- 陷阱 1: 忘记在 Role 中定义
apiGroups,导致资源匹配失败。例如,Deployment 属于apps组,而非核心组。 - 陷阱 2: 多个 RoleBinding 叠加时,权限取 并集。若一个绑定授予 delete 权限,另一个绑定限制只读,最终用户仍可 delete。
- 陷阱 3: ServiceAccount 的 泄露。生产环境应使用 短期 或集成 OIDC,避免将长期 硬编码在配置文件中。
2.6 验证与审计
使用以下命令定期审计租户权限配置:
# 查看指定 Namespace 的所有 RoleBinding
kubectl get rolebinding -n tenant-alpha -o wide
# 查看指定用户的有效权限
kubectl auth can-i --list --as=system:serviceaccount:tenant-alpha:alpha-admin-sa -n tenant-alpha
# 使用 kubectl-who-can 插件查看谁有权操作特定资源
kubectl who-can delete pods -n tenant-alpha
核心要点: Namespace 提供资源隔离边界,RBAC 提供权限控制边界。两者结合,配合 ResourceQuota 和 NetworkPolicy,可构建生产级多租户隔离方案。始终遵循最小权限原则,定期审计权限配置,避免权限扩散风险。