2. 核心概念:RBAC 模型基础、角色、权限、用户与服务账户
在构建云原生平台门户的配置缓存命中巡检功能时,权限控制是保障数据安全与操作合规的基石。Kubernetes 原生的 RBAC(基于角色的访问控制) 模型提供了声明式的授权机制,允许管理员通过预定义的角色与绑定关系,精确控制不同身份对集群资源的访问能力。本节将系统梳理 RBAC 的核心概念,为后续设计巡检专用的权限策略奠定理论基础。
2.1 RBAC 模型基础
RBAC 模型的核心思想是:权限不直接授予用户,而是通过“角色”作为中间层进行间接授权。这种设计极大简化了权限管理,当组织架构或人员变动时,只需调整角色绑定,无需逐个修改用户权限。
Kubernetes RBAC 模型包含四个核心实体:
| 实体 | 英文名称 | 说明 |
|---|---|---|
| 用户 | User | 代表真实的人或组织,通过证书、令牌等方式认证 |
| 服务账户 | ServiceAccount | 代表 Pod 中运行的进程,用于程序化访问 API |
| 角色 | Role / ClusterRole | 定义一组权限规则的集合 |
| 绑定 | RoleBinding / ClusterRoleBinding | 将角色与用户/服务账户/组关联起来 |
关键原则:RBAC 遵循“最小权限”原则。在配置缓存命中巡检场景中,巡检组件应仅被授予读取 ConfigMap、Pod 日志和 Metrics 端点所需的权限,不应授予集群管理或资源删除权限。
2.2 角色(Role)与权限(Permission)
角色是权限的集合。在 Kubernetes 中,角色分为两种作用域:
- Role(命名空间级别):权限仅作用于特定命名空间内的资源。
- ClusterRole(集群级别):权限作用于整个集群,包括所有命名空间、集群范围的资源(如 Node、PersistentVolume)以及非资源端点(如 /healthz)。
权限由三个要素构成:
| 要素 | API 字段 | 示例值 | 说明 |
|---|---|---|---|
| 资源 | resources | configmaps, pods, events | 要操作的 Kubernetes 资源类型 |
| 操作动词 | verbs | get, list, watch, create, update, delete | 允许执行的动作 |
| 资源名称 | resourceNames | cache-config, portal-cache-* | (可选)限定具体资源实例 |
巡检场景示例:若巡检组件只需读取名为
portal-cache-config 的 ConfigMap,则权限应定义为:resources: ["configmaps"],verbs: ["get", "list"],resourceNames: ["portal-cache-config"]。这比授予所有 ConfigMap 的读取权限更安全。
# 示例:为缓存巡检创建的 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: portal-system
name: cache-inspector-role
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list"]
resourceNames: ["portal-cache-config"]
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
- apiGroups: ["metrics.k8s.io"]
resources: ["pods"]
verbs: ["get", "list"]
2.3 用户(User)与服务账户(ServiceAccount)
在 Kubernetes RBAC 中,用户和服务账户是两种不同的身份主体,它们的认证方式和典型用途有显著差异:
| 对比维度 | 用户(User) | 服务账户(ServiceAccount) |
|---|---|---|
| 代表对象 | 真实的人、管理员、开发者 | Pod 中运行的应用程序、自动化组件 |
| 认证方式 | X.509 证书、OIDC 令牌、静态令牌文件 | 挂载的 ServiceAccount 令牌(JWT) |
| 生命周期 | 由集群外部身份管理系统管理 | 由 Kubernetes API 管理,与 Pod 生命周期关联 |
| 命名空间 | 全局(不隶属于命名空间) | 隶属于特定命名空间 |
| 典型用例 | kubectl 操作、CI/CD 流水线 | 巡检组件、日志收集器、监控 Agent |
安全提醒:在配置缓存命中巡检场景中,巡检组件应始终使用 ServiceAccount 而非用户身份。因为 ServiceAccount 的令牌可以自动轮换,且权限范围可精确限定到命名空间级别,避免使用长期有效的用户证书带来的泄露风险。
2.4 绑定关系:将角色赋予身份
角色定义完成后,需要通过绑定将其与用户或服务账户关联。绑定也分为两种:
- RoleBinding:在指定命名空间内,将 Role 或 ClusterRole 绑定到主体。
- ClusterRoleBinding:在整个集群范围内,将 ClusterRole 绑定到主体(不能绑定 Role)。
绑定关系支持以下主体类型:
- User:通过
subjects.kind: User指定用户名。 - Group:通过
subjects.kind: Group指定用户组。 - ServiceAccount:通过
subjects.kind: ServiceAccount指定服务账户名称。
# 示例:将巡检角色绑定到服务账户
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: portal-system
name: cache-inspector-binding
subjects:
- kind: ServiceAccount
name: cache-inspector-sa
namespace: portal-system
roleRef:
kind: Role
name: cache-inspector-role
apiGroup: rbac.authorization.k8s.io
2.5 RBAC 核心概念关系图
下图展示了 RBAC 模型中四个核心实体之间的关联关系,以及权限流动的方向:
2.6 巡检场景中的身份选择
在云原生平台门户的配置缓存命中巡检功能中,推荐使用 ServiceAccount 作为巡检组件的身份。原因如下:
- 自动化运行:巡检组件通常以 CronJob 或 DaemonSet 形式部署在集群内,无需人工交互。
- 权限隔离:每个巡检任务可拥有独立的 ServiceAccount,避免权限混用。
- 令牌自动轮换:Kubernetes 1.21+ 支持 ServiceAccount 令牌的自动轮换,降低密钥泄露风险。
- 命名空间级作用域:ServiceAccount 隶属于命名空间,天然适合按业务模块隔离巡检权限。
最佳实践:为缓存命中巡检创建专用的 ServiceAccount(如
cache-inspector-sa),并为其绑定仅包含 get、list、watch 权限的 Role。避免使用 default ServiceAccount 或集群管理员身份运行巡检任务。