当前位置: 首页 > news >正文

RBAC机制与角色及绑定关系

一、RBAC是什么

RBAC(Role-Based Access Control,基于角色的访问控制)。它是 API Server 授权阶段的核心机制,负责决定“一个已认证的用户能否对某个资源执行某个操作”。



二、RBAC 四大核心资源

K8s RBAC 由 4 种 API 资源构成,全部属于 rbac.authorization.k8s.io/v1 组:

资源类型 作用范围 核心作用
Role 命名空间级别 定义单个命名空间内的权限集合
ClusterRole 集群级别 定义整个集群内的权限集合(可跨命名空间)
RoleBinding 命名空间级别 将用户 / 用户组绑定到 Role,授予命名空间内权限
ClusterRoleBinding 集群级别 将用户 / 用户组绑定到 ClusterRole,授予集群级权限

关键概念补充

  • Subject(主体):被授权的对象,包含 3 类:

    1. User:普通用户(如运维人员、开发人员),K8s 不存储用户,需通过认证插件识别
    2. Group:用户组(如 system:administrators
    3. ServiceAccount:服务账户(Pod 内应用访问 APIServer 的身份)
  • Verb(操作动作):对资源的操作权限,如 get/list/watch/create/update/delete

  • Resource(资源):被操作的 K8s 资源,如 pods/deployments/configmaps



三、角色(Role/ClusterRole):定义权限集合

角色是权限的容器,只定义 “能做什么”,不关联具体用户。

1. 命名空间级角色:Role

  • 作用域:仅对当前命名空间有效,无法跨命名空间
  • 适用场景:给用户授予某命名空间内的资源权限(如开发人员操作 default 命名空间的 Pod)
  • 配置示例(default 命名空间的 Pod 只读角色)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-readernamespace: default  # 必须指定命名空间
rules:
- apiGroups: [""]  # 核心组(core group)为空字符串resources: ["pods", "pods/log"]  # 允许操作的资源verbs: ["get", "list", "watch"]  # 允许的操作动作

2. 集群级角色:ClusterRole

  • 作用域:整个集群,支持 3 类权限定义:

    1. 集群级资源:如 nodes/namespaces(只能用 ClusterRole 定义)
    2. 跨命名空间的命名空间级资源:如允许用户查看所有命名空间的 Pod
    3. 自定义资源(CRD):如 Operator 的 CR 权限
  • 适用场景:集群管理员权限、跨命名空间权限、集群级资源权限

  • 配置示例(集群级 Pod 只读角色)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: cluster-pod-reader  # 无 namespace 字段
rules:
- apiGroups: [""]resources: ["pods", "pods/log"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["nodes"]  # 集群级资源,只能用 ClusterRoleverbs: ["get", "list"]


四、绑定关系(RoleBinding/ClusterRoleBinding):关联用户与角色

绑定是将用户与角色关联的桥梁,核心是 “给哪个用户分配哪个角色的权限”。

1. 命名空间级绑定:RoleBinding

RoleBinding 有 2 种绑定方式

方式 1:绑定同命名空间的 Role(最常用)

user-dev 用户授予 default 命名空间 pod-reader 角色的权限

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: pod-reader-bindingnamespace: default  # 与 Role 同命名空间
subjects:  # 被授权的用户
- kind: Username: user-dev  # 用户名apiGroup: rbac.authorization.k8s.io
roleRef:  # 绑定的角色kind: Role  # 必须是 Rolename: pod-reader  # 角色名apiGroup: rbac.authorization.k8s.io

方式 2:绑定 ClusterRole(实现 “命名空间内的集群角色权限”)

将 ClusterRole cluster-pod-reader 的权限限定在 default 命名空间内,用户只能操作该命名空间的 Pod

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: cluster-pod-reader-bindingnamespace: default
subjects:
- kind: Username: user-devapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRole  # 绑定 ClusterRolename: cluster-pod-readerapiGroup: rbac.authorization.k8s.io

核心价值:复用 ClusterRole 定义,避免重复创建 Role。

2. 集群级绑定:ClusterRoleBinding

  • 作用:给用户授予集群级权限,权限覆盖整个集群
  • 适用场景:集群管理员、跨所有命名空间的权限
  • 配置示例(给 user-admin 授予集群管理员权限)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: cluster-admin-binding
subjects:
- kind: Username: user-adminapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: cluster-admin  # K8s 内置的集群管理员角色apiGroup: rbac.authorization.k8s.io

绑定关系核心规则

  1. roleRef 是不可变的:绑定创建后,无法修改绑定的角色(只能删除重建)

  2. Subject 支持多类型:可同时绑定 User、Group、ServiceAccount

    subjects:
    - kind: Username: user-devapiGroup: rbac.authorization.k8s.io
    - kind: Groupname: dev-groupapiGroup: rbac.authorization.k8s.io
    - kind: ServiceAccountname: app-sanamespace: default
    
  3. ClusterRoleBinding 只能绑定 ClusterRole:无法绑定 Role



五、内置 ClusterRole 与绑定(生产常用)

K8s 内置了一批常用角色,无需手动创建:

内置 ClusterRole 权限描述 适用场景
cluster-admin 集群所有资源的所有操作权限 集群管理员
admin 命名空间内所有资源权限(除集群级资源) 命名空间管理员
edit 命名空间内资源的增删改查 开发人员
view 命名空间内资源的只读权限 测试人员


六、常用命令

# 1. 查看角色
kubectl get roles -n default
kubectl get clusterroles# 2. 查看角色详情(权限规则)
kubectl describe role pod-reader -n default
kubectl describe clusterrole view# 3. 查看绑定关系
kubectl get rolebindings -n default
kubectl get clusterrolebindings
http://www.jsqmd.com/news/646556/

相关文章:

  • 【ROS2实战笔记-3】RViz2图形底层与调试暗坑
  • Cesium for Unity 安装避坑指南
  • Go语言的context.WithDeadline截止时间实现与时钟漂移补偿在分布式
  • 避坑指南:在ultralytics YOLO中集成Mamba-2或Vision Mamba时,如何搞定那个烦人的CUDA张量检查报错
  • 2026届最火的五大AI科研神器推荐榜单
  • Halcon实战:5分钟搞定工业视觉直线度检测(附完整代码)
  • 企微获客数据可视化——无工具数据黑盒vs工具化数据追溯的技术实现
  • 单细胞分析实战:sctransform标准化避坑指南(附Seurat代码)
  • MIPI CSI-2 信号完整性实战:从波形抓取到问题定位
  • 2025届最火的十大AI科研神器推荐榜单
  • 【ROS2实战笔记-4】Gazebo:从通信桥接到性能瓶颈相关技术梳理
  • 为什么92.3%的设计团队在3个月内弃用AI助手?奇点大会闭门论坛首曝失败归因矩阵
  • 手把手教你用奥比中光Astra-Mini实现ROS下的3D手势识别(含rviz可视化教程)
  • uniApp深色模式闪白?这5个优化技巧让你的App体验更流畅
  • 读懂加密市场(五):进阶之路
  • 系统架构评审要点
  • 鸿蒙Next应用开发:除了官方SDK,这两种拉起支付宝的野路子你试过吗?
  • Python自动化抢票终极指南:告别手速比拼,轻松搞定热门演出门票
  • 从GUI到CLI:ModelSim仿真效率提升实战,告别图形界面卡顿与配置烦恼
  • 2026奇点大会AI视频生成技术演进路线图:2024Q4→2026Q2关键节点预测(含3家头部厂商未发布模型参数与训练数据规模)
  • 如何通过插件化架构解决Java字节码编辑工具的扩展性难题
  • 3分钟解决Windows软件运行库问题:VisualCppRedist AIO终极指南
  • (arch)linuxArm设备回滚
  • 监控管理化技术监控策略与告警分级
  • DBeaver连接OceanBase Oracle租户实战:从驱动配置到表结构查看的完整避坑指南
  • Unity Timeline信号(Signal)轨道实战:如何让时间线“指挥”你的游戏脚本?
  • Unity Asset Bundle文件结构拆解:用十六进制编辑器手把手分析Header与Block
  • 视频开发者必看:NV12、I420、I444、P010格式转换实战指南(附代码)
  • Unreal是如何驾驭内存的 第11章 字符串与名称系统——FName、FString、FText
  • MATLAB App Designer多窗口数据交互的3种高效实现方案