Kubernetes多租户发布流水线RBAC自动配置 - 第2节

2.1 RBAC 核心概念:为什么需要细粒度权限控制

Kubernetes 的 RBAC(基于角色的访问控制) 是集群安全的基础设施。在多租户场景下,不同团队(如开发、测试、运维)需要不同的操作权限:开发人员只需管理命名空间内的 Pod 和 Deployment,而集群管理员需要全局操作权限。RBAC 通过“角色”与“绑定”的分离,实现了权限的灵活分配与审计。

核心原则: 权限最小化(Least Privilege)——每个用户或服务只获得完成其任务所需的最小权限集合。

2.1.1 四个核心 API 对象

RBAC 体系由四个关键资源组成,它们共同定义了“谁”能对“什么资源”执行“哪些操作”:

对象 作用域 作用 典型用途
Role 命名空间(Namespace) 定义一组权限规则(如 get、list、create Pod) 限制开发人员只能操作指定命名空间
ClusterRole 集群范围(Cluster-wide) 定义集群级别的权限规则(如查看 Node、管理 PV) 赋予管理员全局操作能力
RoleBinding 命名空间(Namespace) 将 Role 绑定到 Subject(用户/组/SA) 将“开发者”角色绑定到“张三”用户
ClusterRoleBinding 集群范围(Cluster-wide) 将 ClusterRole 绑定到 Subject 将“集群管理员”角色绑定到运维组

2.1.2 权限规则结构

每个 Role 或 ClusterRole 包含一组规则(rules),每条规则由三个字段组成:

  • apiGroups:API 组,如 ""(核心组)、"apps"、"batch"。
  • resources:资源类型,如 pods、deployments、services。
  • verbs:操作动词,如 get、list、create、update、delete。
# 示例:一个允许在命名空间 "dev" 中管理 Pod 的 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: pod-manager
rules:
- apiGroups: [""]          # 核心 API 组
  resources: ["pods"]      # 资源类型
  verbs: ["get", "list", "watch", "create", "update", "delete"]
RBAC 核心对象关系图 Subject(主体) User(用户) Group(组) ServiceAccount(SA) 绑定(Binding) RoleBinding (命名空间级) ClusterRoleBinding (集群级) 角色(Role) Role (命名空间级) ClusterRole (集群级) 绑定将 Subject 与 Role 关联,决定主体能对哪些资源执行哪些操作

2.2 Subject 类型:谁在发起请求

在 Kubernetes 中,所有 API 请求都来自一个 Subject(主体)。RBAC 支持三种主体类型:

Subject 类型 来源 典型场景 示例
User 外部身份系统(如 OIDC、LDAP、证书) 人类管理员、开发人员通过 kubectl 操作 alice@example.com
Group 外部身份系统中的用户组 批量授权(如“dev-team”组所有成员) system:serviceaccounts:dev
ServiceAccount Kubernetes 内部资源 Pod 内应用调用 API(如 CI/CD 流水线) jenkins-agent

2.2.1 ServiceAccount:自动化流水线的核心身份

在多租户发布流水线中,ServiceAccount(SA) 是最常用的主体类型。每个命名空间可以创建多个 SA,Pod 通过挂载 SA 的 来认证自身。

# 创建一个 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pipeline-runner
  namespace: team-a
最佳实践: 每个微服务或流水线任务使用独立的 ServiceAccount,避免共享 导致权限扩散。

2.2.2 内置用户与组

Kubernetes 预定义了一些系统级用户和组,用于集群内部组件通信:

  • system:admin:集群超级管理员(通常通过证书认证)。
  • system:kube-scheduler:调度器使用的身份。
  • system:serviceaccounts:所有 ServiceAccount 的组。
  • system:authenticated:所有已认证用户的组。
Subject 类型与认证流程 User(用户) Group(组) ServiceAccount 认证层 TLS 证书 验证 OIDC / LDAP 授权决策 RBAC 规则匹配 允许 / 拒绝

2.3 RoleBinding 与 ClusterRoleBinding:绑定规则详解

绑定(Binding)是 RBAC 的“胶水”,它将角色与主体连接起来。理解两种绑定的区别至关重要:

特性 RoleBinding ClusterRoleBinding
作用域 仅限单个命名空间 整个集群(所有命名空间)
可绑定的角色 Role(同命名空间)或 ClusterRole 仅 ClusterRole
典型用途 授予开发人员对“dev”命名空间的访问 授予集群管理员全局权限
安全风险 较低(隔离在命名空间内) 较高(可能影响整个集群)

2.3.1 使用 ClusterRole 与 RoleBinding 实现跨命名空间复用

一个常见模式是:创建 ClusterRole 定义通用权限(如 Pod 只读),然后通过 RoleBinding 将其绑定到不同命名空间的 ServiceAccount。这样既避免了重复定义 Role,又保持了命名空间隔离。

# 1. 创建 ClusterRole(集群级,定义通用权限)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

---
# 2. 在命名空间 "team-a" 中绑定到 ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: team-a
subjects:
- kind: ServiceAccount
  name: pipeline-runner
  namespace: team-a
roleRef:
  kind: ClusterRole
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
注意: 当 RoleBinding 引用 ClusterRole 时,权限仍然只作用于该 RoleBinding 所在的命名空间。只有 ClusterRoleBinding 才能将权限扩展到整个集群。

2.4 多租户场景下的 RBAC 设计原则

在自动化发布流水线中,RBAC 配置需要遵循以下原则:

  1. 命名空间隔离:每个租户(团队/项目)使用独立命名空间,Role 和 RoleBinding 限定在命名空间内。
  2. ServiceAccount 专用化:每个流水线任务(如构建、部署、测试)使用独立的 SA,避免权限混用。
  3. 最小权限:只授予流水线执行所需的最小动词集合(如只给 create 不给 delete)。
  4. 审计可追溯:通过 ClusterRoleBinding 绑定组而非单个用户,便于通过外部 IDP 管理成员变更。
关键指标: 一个健康的 RBAC 配置应满足:每个命名空间不超过 5 个 RoleBinding,每个 ServiceAccount 只绑定 1 个 Role。