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

第十一篇:细粒度权限控制(RBAC)

 

官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

RBAC授权模式

RBAC(Role-Based Access Control):基于角色的访问控制机制,它通过为特定资源定义操作权限,并将这些权限绑定到用户、组或服务账户,来精细化管理集群资源的访问授权

  • 角色为中心:权限封装在 角色 中,绑定给 主体。
  • 精细授权:权限可细化到资源、API组、操作和名称空间。
  • 最小权限原则:默认无权限,必须显式授予所需的最小权限。
  • 动态更新:授权规则可动态更新,无需重启组件。
  • 资源可审计:所有授权配置都是API对象,易于查看和管理

RBAC API类型

image

 

 

在 RBAC 中,角色权限只能添加权限,无法定义“拒绝”规则

在 RBAC API 中,一个角色包含一组相关权限的规则。角色可以用 Role 来定义到某个命名空间(namespace)上, 或者用 ClusterRole 来定义到整个集群作用域(所有namespace)。

一个 Role 只可以用来对某一命名空间中的资源赋予访问权限。

k8s-RBAC-verbs操作类型

操作类型API 对应操作描述示例命令
get GET 获取单个资源的详细信息 kubectl get pod nginx-1 -o yaml
watch WATCH 监听资源的变化(实时更新) kubectl get pods -w
list LIST 列出命名空间内的所有资源 kubectl get pods
create CREATE 创建新资源 kubectl create -f pod.yaml
update PUT 更新整个资源 kubectl replace -f pod.yaml
patch PATCH 部分更新资源 kubectl patch pod nginx --type='merge' -p='{"spec": {"containers": [...]}}'
delete DELETE 删除单个资源 kubectl delete pod nginx
deletecollection DELETE 批量删除多个资源 kubectl delete pods --all
***** 所有操作 对该资源拥有所有权限 授予完全控制权

常用权限组合:

  • 只读权限:["get", "list", "watch"]
  • 读写权限:["get", "list", "watch", "create", "update", "patch", "delete"]
  • 完全控制:["*"] 或 ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"]

 

 

# 启动基于角色访问控制(RBAC)的 API Server 的授权配置
[root@k8s-master01 ~]# grep -e "--authorization" /usr/lib/systemd/system/kube-apiserver.service --authorization-mode=Node,RBAC  \

 

kubectl get roles,rolebindings -n <namespace># 查看所有角色(Role)和集群角色(ClusterRole)
kubectl get roles,clusterroles --all-namespaces# 查看所有角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)
kubectl get rolebindings,clusterrolebindings --all-namespaces

 

Role示例

命令空间资源:pod,doployment,service

kubectl api-resources --namespaced=true

[root@k8s-master01 rbac]# kubectl create namespace kube-rbac

[root@k8s-master01 rbac]# cat pod-reader.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: kube-rbacname: pod-reader
rules:
- apiGroups: [""]  # 指定要授权的API组(一般指定一个空字符串)resources: ["pods"]  # 指定要授权的资源类型verbs: ["get", "watch", "list"]  # 允许的操作类型

 

ClusterRole示例

ClusterRole 能够授权的三种特殊权限类型

集群范围资源:全局唯一,不属于任何命名空间的资源(Node、pv、storageclass)

非资源端点:不是kubernetes API对象的HTTP端点

curl -k https://api-server:6443/healthz
curl -k https://api-server:6443/livez
curl -k https://api-server:6443/readyz

跨命令空间访问:虽然是命名空间资源,但是可以访问所有命名空间

[root@k8s-master01 rbac]# cat ops-engineer.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: ops-engineer
rules:
# 1. 集群范围资源
- apiGroups: [""]resources: ["nodes", "persistentvolumes"]verbs: ["get", "list", "watch"]# 2. 跨命名空间访问
- apiGroups: [""]resources: ["pods", "services", "events"]verbs: ["get", "list", "watch"]# 3. 非资源端点(监控用)
- nonResourceURLs: ["/healthz", "/metrics"]verbs: ["get"]
[root@k8s-master01 rbac]# kubectl get clusterroles |grep ops-engineer
ops-engineer                                         2025-12-08T03:30:13Z

 

 

RoleBinding

[root@k8s-master01 rbac]# cat read-pods-rolebinding.yaml 
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-pods-rolebindingnamespace: kube-rbac
subjects:  # 配置绑定对象,可以配置多个
- kind: User  # 绑定对象的类别(User、Group、Service Account)name: jiang  # 绑定对象的名字apiGroup: rbac.authorization.k8s.io
roleRef:  # 绑定的类别kind: Role  # kind:指定权限来源(Role或ClusterRole)name: pod-reader  # name:Role或ClusterRole的名字apiGroup: rbac.authorization.k8s.io  # API组名
kubectl auth can-i create pods --namespace kube-rbac --as jiangkubectl auth can-i:RBAC权限检查命令
create pods:要检查的 操作 + 资源
--as jiang:模拟用户身份

 

[root@k8s-master01 rbac]# kubectl get rolebinding  -n kube-rbac
NAME                    ROLE              AGE
read-pods-rolebinding   Role/pod-reader   12m[root@k8s-master01 rbac]# kubectl describe rolebinding read-pods-rolebinding -n kube-rbac
Name:         read-pods-rolebinding
Labels:       <none>
Annotations:  <none>
Role:Kind:  RoleName:  pod-reader
Subjects:Kind  Name  Namespace----  ----  ---------User  jiang

 

常见的几种Role书写

# 允许读取在核心 API 组下的 "pods"
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]# 允许读取名称为 "my-config" 的 ConfigMap
rules:
- apiGroups: [""]resources: ["configmaps"]  # 资源类型resourceNames: ["my-config"]  # 资源名称verbs: ["get"]

 

对主体的引用

RoleBinding 或者 ClusterRoleBinding 可绑定角色到某主体(Subject) 上, 主体可以是组,用户或者服务账户

# 对于名称为 alice@example.com 的用户
subjects:
- kind: Username: "alice@example.com"apiGroup: rbac.authorization.k8s.io# 对于名称为 frontend-admins 的用户组
subjects:
- kind: Groupname: "frontend-admins"apiGroup: rbac.authorization.k8s.io# 对于某个名称空间中的某个服务账户
subjects:
- kind: ServiceAccountname: <服务账户名称>namespace: <命名空间名称># 对于某个名称空间中的所有服务账户
subjects:
- kind: Groupname: system:serviceaccounts:<名称空间的名称>apiGroup: rbac.authorization.k8s.io

 

Kubernetes默认ClusterRole权限

默认 ClusterRole默认绑定描述
cluster-admin system:masters 组 - ClusterRoleBinding:完全控制集群和所有命名空间
- RoleBinding:完全控制所在命名空间(包括命名空间本身)
admin - RoleBinding:命名空间内大多数资源的读写权限
- 可创建角色和角色绑定
- 不可操作:资源配额、命名空间本身、v1.22+ 的 EndpointSlices
edit - RoleBinding:命名空间内大多数对象的读写权限
- 可访问 Secret、以任何 ServiceAccount 运行 Pod
- 不可操作:角色/角色绑定、v1.22+ 的 EndpointSlices
view - RoleBinding:命名空间内大多数对象的只读权限
- 不可查看:角色/角色绑定、Secret(防止特权提升)

命令行工具

https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/#command-line-utilities

# 创建Role对象/ClusterRole对象
kubectl create role 对象名 --verb=get --verb=list --verb=watch --resource=pods  \
--resource-name=resourceNames kubectl create clusterrole 对象名 --verb=get,list,watch --resource=pods \
--resource-name=resourceNames

# 创建rolebinding/clusterrolebinding
kubectl create rolebinding rolebinding名 --clusterrole=admin --user=bob --namespace=acme
kubectl create clusterrolebinding rolebinding名 --clusterrole=cluster-admin --user=root

 

kubectl auth can-i create pods --namespace kube-rbac --as jiangkubectl auth can-i:RBAC权限检查命令
create pods:要检查的 操作 + 资源
--as jiang:模拟用户身份

 

聚合ClusterRole

聚合ClusterRole是Kubernetes中的一种特殊ClusterRole,它可以通过标签选择器(labelSelector)自动聚合其他ClusterRole的规则,实现权限规则的动态组合和复用。

[root@k8s-master01 ~]# kubectl create -f monitoring.yaml ^C
[root@k8s-master01 ~]# kubectl get clusterrole monitoring
NAME         CREATED AT
monitoring   2025-12-08T09:45:52Z
[root@k8s-master01 ~]# kubectl get clusterrole monitoring -oyaml |grep rules
rules: null

[root@k8s-master01 ~]# kubectl create -f monitoring-endpoints.yaml

[root@k8s-master01 ~]# kubectl get clusterrole monitoring -oyaml |grep -A 5

 

如何进行授权

image

image

RBAC企业实战:不同用户不同权限

用户yuan可以查看default、kube-system命名空间下的Pod的日志

用户jiang可以查看default命名空间下的Pod中执行的命令,并且可以删除Pod

 

http://www.jsqmd.com/news/67228/

相关文章:

  • 2025 年 12 月 L360N 管线管,L415N 管线管厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读
  • 2025年12月钢板仓源头厂家推荐: 粉煤灰钢板仓,螺旋卷板仓,焊接钢板仓厂家以技术创新赋能物料存储升级
  • 2025 年养老护工服务平台最新推荐榜,聚焦企业服务品质与用户口碑深度解析品牌好的,比较好的,靠谱的,有实力的,可靠的,正规的,专业的,最好的,知名的,优质养老护工服务机构推荐
  • 2025年市面上有实力的尘埃粒子计数器供应商哪家权威,空气粒子计数器/激光尘埃粒子计数器/大流量尘埃粒子计数器供应厂家排名
  • 大屏可视化演示
  • 2025年12月桥梁支座,减震支座厂家最新推荐,聚焦资质、案例、售后的十家机构深度解读!
  • 2025年连续激光清洗机厂商实力榜单:激光除胶/脉冲激光清洗/便携式激光清洗机源头厂家精选
  • 2025年权威盘点:十大优质机床钣金外壳生产商,评价高的机床钣金外壳口碑推荐榜睿意达发展迅速,实力雄厚
  • 01 安装与运行
  • 【python自动化测试】uiautomator2中watcher的使用问题
  • A*
  • AlexNet论文阅读笔记
  • 2025年云南少数民族美食推荐,正宗云南美食攻略全解析
  • 2025年十大压铸点冷机生产厂排行榜,合作案例/技术实力/维
  • 2025压铸油温机制造厂TOP5权威推荐:技术参数与性能评测
  • 2025年市面上可靠的化粪池清掏公司电话,行业内专业的化粪池清掏公司推荐
  • java集成yolo11 onnx模型推理
  • IDE 里配置基于 AtomGit(GitCode)的 Git
  • 2025年实验室反应釜厂家TOP5推荐,实验室反应釜认证厂家
  • 2025 年 12 月电源老化柜厂家权威推荐榜:覆盖快充、储能、AV音响及模块电源等全场景的耐用高效老化测试设备精选
  • 2025年重庆电力总包资质代办和转让机构排行榜,电力总包资质
  • 在 Pycharm 中 debug Scrapy 项目
  • 2025年知名电缆生产厂家推荐:十大知名品牌实力解析及选购指南名单(12月新版)
  • 2025年中国工业节能设备五大生产厂家推荐:河南丰华实力凸显
  • 2025重庆电力总包资质代办和转让TOP5推荐:电力总包资质
  • 2025 年 12 月噻唑膦生产厂家最新推荐榜:专业防治土传病害、死苗烂根(年终盘点)
  • 2025年重庆电力总包资质代办和转让服务哪家强?五大权威机构
  • 2025年上海晶体炉装置服务商排名:晶体炉供应企业哪家专业
  • 2025年最新继承官司律师机构服务能力排行,继承纠纷律师/北京继承律师哪个好/北京丰台继承律师/北京丰台离婚律师继承官司律师律所找哪家
  • 2025年12月油烟净化设备品牌推荐榜:厨房/无烟管/商用/家用/复合式/内循环/小型/油烟净化厂家,上海多环用技术破局安装难题,成餐饮商户新选择