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 模型中四个核心实体之间的关联关系,以及权限流动的方向:

RBAC 核心概念关系图 User 真实用户 / 管理员 ServiceAccount Pod 内进程身份 Role / ClusterRole 权限规则集合 RoleBinding 关联角色与身份 Permission 资源 + 动词 绑定 绑定 引用 授予 权限流动方向: User / ServiceAccount → RoleBinding → Role → Permission 巡检组件通过 ServiceAccount 身份,经 RoleBinding 获得 Role 中定义的 ConfigMap 读取权限。

2.6 巡检场景中的身份选择

在云原生平台门户的配置缓存命中巡检功能中,推荐使用 ServiceAccount 作为巡检组件的身份。原因如下:

  1. 自动化运行:巡检组件通常以 CronJob 或 DaemonSet 形式部署在集群内,无需人工交互。
  2. 权限隔离:每个巡检任务可拥有独立的 ServiceAccount,避免权限混用。
  3. 令牌自动轮换:Kubernetes 1.21+ 支持 ServiceAccount 令牌的自动轮换,降低密钥泄露风险。
  4. 命名空间级作用域:ServiceAccount 隶属于命名空间,天然适合按业务模块隔离巡检权限。
最佳实践:为缓存命中巡检创建专用的 ServiceAccount(如 cache-inspector-sa),并为其绑定仅包含 get、list、watch 权限的 Role。避免使用 default ServiceAccount 或集群管理员身份运行巡检任务。