计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
弹性伸缩 AS
镜像服务 IMS
专属主机 DeH
函数工作流 FunctionGraph
云手机服务器 CPH
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
虚拟专用网络 VPN
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
VPC终端节点 VPCEP
云连接 CC
企业路由器 ER
企业交换机 ESW
全球加速 GA
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
边缘安全 EdgeSec
威胁检测服务 MTD
CDN与智能边缘
内容分发网络 CDN
CloudPond云服务
智能边缘云 IEC
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
云搜索服务 CSS
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
数据可视化 DLV
数据湖工厂 DLF
湖仓构建 LakeFormation
企业应用
云桌面 Workspace
应用与数据集成平台 ROMA Connect
云解析服务 DNS
专属云
专属计算集群 DCC
IoT物联网
IoT物联网
设备接入 IoTDA
智能边缘平台 IEF
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
国际站常见问题
ICP备案
我的凭证
支持计划
客户运营能力
合作伙伴支持计划
专业服务
区块链
区块链服务 BCS
Web3节点引擎服务 NES
解决方案
SAP
高性能计算 HPC
视频
视频直播 Live
视频点播 VOD
媒体处理 MPC
实时音视频 SparkRTC
数字内容生产线 MetaStudio
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
存储容灾服务 SDRS
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属分布式存储服务 DSS
容器
云容器引擎 CCE
容器镜像服务 SWR
应用服务网格 ASM
华为云UCS
云容器实例 CCI
管理与监管
云监控服务 CES
统一身份认证服务 IAM
资源编排服务 RFS
云审计服务 CTS
标签管理服务 TMS
云日志服务 LTS
配置审计 Config
资源访问管理 RAM
消息通知服务 SMN
应用运维管理 AOM
应用性能管理 APM
组织 Organizations
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
应用身份管理服务 OneAccess
数据库
云数据库 RDS
文档数据库服务 DDS
数据管理服务 DAS
数据复制服务 DRS
云数据库 GeminiDB
云数据库 GaussDB
分布式数据库中间件 DDM
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
人脸识别服务 FRS
图引擎服务 GES
图像识别 Image
内容审核 Moderation
文字识别 OCR
AI开发平台ModelArts
图像搜索 ImageSearch
对话机器人服务 CBS
华为HiLens
视频智能分析服务 VIAS
语音交互服务 SIS
应用中间件
分布式缓存服务 DCS
API网关 APIG
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
多活高可用服务 MAS
事件网格 EG
企业协同
华为云会议 Meeting
云通信
消息&短信 MSGSMS
云生态
合作伙伴中心
云商店
开发者工具
SDK开发指南
API签名指南
Terraform
华为云命令行工具服务 KooCLI
其他
产品价格详情
系统权限
管理控制台
客户关联华为云合作伙伴须知
消息中心
公共问题
开发与运维
应用管理与运维平台 ServiceStage
软件开发生产线 CodeArts
需求管理 CodeArts Req
部署 CodeArts Deploy
性能测试 CodeArts PerfTest
编译构建 CodeArts Build
流水线 CodeArts Pipeline
制品仓库 CodeArts Artifact
测试计划 CodeArts TestPlan
代码检查 CodeArts Check
代码托管 CodeArts Repo
云应用引擎 CAE
开天aPaaS
云消息服务 KooMessage
云手机服务 KooPhone
云空间服务 KooDrive
文档首页/ 云容器引擎 CCE/ 用户指南(吉隆坡区域)/ 权限/ 命名空间权限(Kubernetes RBAC授权)

命名空间权限(Kubernetes RBAC授权)

更新时间:2024-10-14 GMT+08:00

命名空间权限(kubernetes RBAC授权)

命名空间权限是基于Kubernetes RBAC能力的授权,通过权限设置可以让不同的用户或用户组拥有操作不同Kubernetes资源的权限。Kubernetes RBAC API定义了四种类型:Role、ClusterRole、RoleBinding与ClusterRoleBinding,这四种类型之间的关系和简要说明如下:

  • Role:角色,其实是定义一组对Kubernetes资源(命名空间级别)的访问规则。
  • RoleBinding:角色绑定,定义了用户和角色的关系。
  • ClusterRole:集群角色,其实是定义一组对Kubernetes资源(集群级别,包含全部命名空间)的访问规则。
  • ClusterRoleBinding:集群角色绑定,定义了用户和集群角色的关系。

Role和ClusterRole指定了可以对哪些资源做哪些动作,RoleBinding和ClusterRoleBinding将角色绑定到特定的用户、用户组或ServiceAccount上。如下图所示。

图1 角色绑定
在CCE控制台可以授予用户或用户组命名空间权限,可以对某一个命名空间或全部命名空间授权,CCE控制台默认提供如下ClusterRole。
  • view(只读权限):对全部或所选命名空间下大多数资源的只读权限。
  • edit(开发权限):对全部或所选命名空间下多数资源的读写权限。当配置在全部命名空间时能力与运维权限一致。
  • admin(运维权限):对全部命名空间下大多数资源的读写权限,对节点、存储卷,命名空间和配额管理的只读权限。
  • cluster-admin(管理员权限):对全部命名空间下所有资源的读写权限。

除了使用上述常用的ClusterRole外,您还可以通过定义Role和RoleBinding来进一步对全局资源(如Node、PersistentVolumes、CustomResourceDefinitions等)和命名空间中不同类别资源(如Pod、Deployment、Service等)的增删改查权限进行配置,从而做到更加精细化的权限控制。

集群权限(IAM授权)与命名空间权限(Kubernetes RBAC授权)的关系

拥有不同集群权限(IAM授权)的用户,其拥有的命名空间权限(Kubernetes RBAC授权)不同。表1给出了不同用户拥有的命名空间权限详情。

表1 不同用户拥有的命名空间权限

用户类型

1.13及以上版本的集群

拥有Tenant Administrator权限的用户

全部命名空间权限

拥有CCE Administrator权限的IAM用户

全部命名空间权限

拥有CCE FullAccess或者CCE ReadOnlyAccess权限的IAM用户

按Kubernetes RBAC授权

拥有Tenant Guest权限的IAM用户

按Kubernetes RBAC授权

注意事项

  • 任何用户创建集群后,CCE会自动为该用户添加该集群的所有命名空间的cluster-admin权限,也就是说该用户允许对集群以及所有命名空间中的全部资源进行完全控制。联邦用户由于每次登录注销都会改变用户ID,所以权限用户会显示已删除,此情况下请勿删除该权限,否则会导致鉴权失败。此种情况下建议在CCE为某个用户组创建cluster-admin权限,将联邦用户加入此用户组。
  • 拥有Security Administrator(IAM除切换角色外所有权限)权限的用户(如账号所在的admin用户组默认拥有此权限),才能在CCE控制台命名空间权限页面进行授权操作。

配置命名空间权限(控制台)

CCE中的命名空间权限是基于Kubernetes RBAC能力的授权,通过权限设置可以让不同的用户或用户组拥有操作不同Kubernetes资源的权限。

  1. 登录CCE控制台,在左侧导航栏中选择“权限管理”
  2. 在右边下拉列表中选择要添加权限的集群。
  3. 在右上角单击“添加权限”,进入添加授权页面。
  4. 在添加权限页面,确认集群名称,选择该集群下要授权使用的命名空间,例如选择“全部命名空间”,选择要授权的用户或用户组,再选择具体权限。

    说明:

    对于没有IAM权限的用户,给其他用户和用户组配置权限时,无法选择用户和用户组,此时支持填写用户ID或用户组ID进行配置。

    其中自定义权限可以根据需要自定义,选择自定义权限后,在自定义权限一行右侧单击新建自定义权限,在弹出的窗口中填写名称并选择规则。创建完成后,在添加权限的自定义权限下拉框中可以选择。

    自定义权限分为ClusterRole或Role两类,ClusterRole或Role均包含一组代表相关权限的规则,详情请参见使用RBAC鉴权

    • ClusterRole:ClusterRole是一个集群级别的资源,可设置集群的访问权限。
    • Role:Role用于在某个命名空间内设置访问权限。当创建Role时,必须指定该Role所属的命名空间。

  5. 单击“确定”

自定义命名空间权限(kubectl)

说明:

kubectl访问CCE集群是通过集群上生成的配置文件(kubeconfig.json)进行认证,kubeconfig.json文件内包含用户信息,CCE根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig.json文件,kubeconfig.json就拥有哪个用户的信息,这样使用kubectl访问时就拥有这个用户的权限。而用户拥有的权限就是集群权限(IAM授权)与命名空间权限(Kubernetes RBAC授权)的关系所示的权限。

除了使用cluster-admin、admin、edit、view这4个最常用的clusterrole外,您还可以通过定义Role和RoleBinding来进一步对命名空间中不同类别资源(如Pod、Deployment、Service等)的增删改查权限进行配置,从而做到更加精细化的权限控制。

Role的定义非常简单,指定namespace,然后就是rules规则。如下面示例中的规则就是允许对default命名空间下的Pod进行GET、LIST操作。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default                          # 命名空间
  name: role-example
rules:
- apiGroups: [""]
  resources: ["pods"]                         # 可以访问pod
  verbs: ["get", "list"]                      # 可以执行GET、LIST操作
  • apiGroups表示资源所在的API分组。
  • resources表示可以操作哪些资源:pods表示可以操作Pod,其他Kubernetes的资源如deployments、configmaps等都可以操作
  • verbs表示可以执行的操作:get表示查询一个Pod,list表示查询所有Pod。您还可以使用create(创建), update(更新), delete(删除)等操作词。

详细的类型和操作请参见使用 RBAC 鉴权

有了Role之后,就可以将Role与具体的用户绑定起来,实现这个的就是RoleBinding了。如下所示。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: RoleBinding-example
  namespace: default
  annotations:
    CCE.com/IAM: 'true'
roleRef:
  kind: Role
  name: role-example
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
  name: 0c97ac3cb280f4d91fa7c0096739e1f8    # user-example的用户ID
  apiGroup: rbac.authorization.k8s.io

这里的subjects就是将Role与IAM用户绑定起来,从而使得IAM用户获取role-example这个Role里面定义的权限,如下图所示。

图2 RoleBinding绑定Role和用户

subjects下用户的类型还可以是用户组,这样配置可以对用户组下所有用户生效。

subjects:
- kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7    # 用户组ID
  apiGroup: rbac.authorization.k8s.io

使用IAM用户user-example连接集群,获取Pod信息,发现可获取到Pod的信息。

# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
deployment-389584-2-6f6bd4c574-2n9rk   1/1     Running   0          4d7h
deployment-389584-2-6f6bd4c574-7s5qw   1/1     Running   0          4d7h
deployment-3895841-746b97b455-86g77    1/1     Running   0          4d7h
deployment-3895841-746b97b455-twvpn    1/1     Running   0          4d7h
nginx-658dff48ff-7rkph                 1/1     Running   0          4d9h
nginx-658dff48ff-njdhj                 1/1     Running   0          4d9h
# kubectl get pod nginx-658dff48ff-7rkph
NAME                     READY   STATUS    RESTARTS   AGE
nginx-658dff48ff-7rkph   1/1     Running   0          4d9h

然后查看Deployment和Service,发现没有权限;再查询kube-system命名空间下的Pod信息,发现也没有权限。这就说明IAM用户user-example仅拥有default这个命名空间下GET和LIST Pod的权限,与前面定义的没有偏差。

# kubectl get deploy
Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default"
# kubectl get svc
Error from server (Forbidden): services is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "services" in API group "" in the namespace "default"
# kubectl get pod --namespace=kube-system
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system"

示例:授予集群管理员权限(cluster-admin)

集群全部权限可以使用cluster-admin权限,cluster-admin包含集群所有资源的权限。

如果使用kubectl查看可以看到创建了一个ClusterRoleBinding,将cluster-admin和cce-role-group这个用户组绑定了起来。

# kubectl get clusterrolebinding
NAME                                                              ROLE                           AGE
clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/cluster-admin      61s

# kubectl get clusterrolebinding clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-23T09:15:22Z"
  name: clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7
  resourceVersion: "36659058"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7
  uid: d6cd43e9-b4ca-4b56-bc52-e36346fc1320
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

使用被授予用户连接集群,如果能正常查询PV、StorageClass的信息,则说明权限配置正常。

# kubectl get pv
No resources found
# kubectl get sc
NAME                PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-disk            everest-csi-provisioner         Delete          Immediate              true                   75d
csi-disk-topology   everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   75d
csi-nas             everest-csi-provisioner         Delete          Immediate              true                   75d
csi-obs             everest-csi-provisioner         Delete          Immediate              false                  75d

示例:授予命名空间运维权限(admin)

admin权限拥有命名空间大多数资源的读写权限,您可以授予用户/用户组全部命名空间admin权限。

如果使用kubectl查看可以看到创建了一个RoleBinding,将admin和cce-role-group这个用户组绑定了起来。

# kubectl get rolebinding
NAME                                                      ROLE                AGE
clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/admin   18s
# kubectl get rolebinding clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-24T01:30:08Z"
  name: clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  resourceVersion: "36963685"
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  uid: 6c6f46a6-8584-47da-83f5-9eef1f7b75d6
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

使用被授予用户连接集群,如果能正常查询PV、StorageClass的信息,但无法创建命名空间,则说明权限配置正常。

# kubectl get pv
No resources found
# kubectl get sc
NAME                PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-disk            everest-csi-provisioner         Delete          Immediate              true                   75d
csi-disk-topology   everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   75d
csi-nas             everest-csi-provisioner         Delete          Immediate              true                   75d
csi-obs             everest-csi-provisioner         Delete          Immediate              false                  75d
# kubectl apply -f namespaces.yaml
Error from server (Forbidden): namespaces is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot create resource "namespaces" in API group "" at the cluster scope

示例:授予命名空间开发权限(edit)

edit权限拥有命名空间大多数资源的读写权限,您可以授予用户/用户组全部命名空间edit权限。

如果使用kubectl查看可以看到创建了一个RoleBinding,将edit和cce-role-group这个用户组绑定了起来,且权限范围是default这个命名空间。

# kubectl get rolebinding
NAME                                                      ROLE                AGE
clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/admin   18s
# kubectl get rolebinding clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-24T01:30:08Z"
  name: clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  namespace: default
  resourceVersion: "36963685"
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  uid: 6c6f46a6-8584-47da-83f5-9eef1f7b75d6
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

使用被授予用户连接集群,您会发现可以查询和创建default命名空间的资源,但无法查询kube-system命名空间资源,也无法查询集群级别的资源。

# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
test-568d96f4f8-brdrp   1/1     Running   0          33m
test-568d96f4f8-cgjqp   1/1     Running   0          33m
# kubectl get pod -nkube-system
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system"
# kubectl get pv
Error from server (Forbidden): persistentvolumes is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "persistentvolumes" in API group "" at the cluster scope

示例:授予命名空间只读权限(view)

view权限拥有命名空间查看权限,您可以给某个或全部命名空间授权。

如果使用kubectl查看可以看到创建了一个RoleBinding,将view和cce-role-group这个用户组绑定了起来,且权限范围是default这个命名空间。

# kubectl get rolebinding
NAME                                                     ROLE               AGE
clusterrole_view_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/view   7s

# kubectl get rolebinding clusterrole_view_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-24T01:36:53Z"
  name: clusterrole_view_group0c96fad22880f32a3f84c009862af6f7
  namespace: default
  resourceVersion: "36965800"
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_view_group0c96fad22880f32a3f84c009862af6f7
  uid: b86e2507-e735-494c-be55-c41a0c4ef0dd
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

使用被授予用户连接集群,您会发现可以查询default命名空间的资源,但无法创建资源。

# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
test-568d96f4f8-brdrp   1/1     Running   0          40m
test-568d96f4f8-cgjqp   1/1     Running   0          40m
# kubectl run -i --tty --image tutum/dnsutils dnsutils --restart=Never --rm /bin/sh
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot create resource "pods" in API group "" in the namespace "default"

示例:授予某类Kubernetes资源权限

上面几个示例都是集群全部资源(cluster-admin)、命名空间全部资源(admin、view),也可以对某类Kubernetes资源授权,如Pod、Deployment、Service这些资源,具体请参见自定义命名空间权限(kubectl)

我们使用cookie来确保您的高速浏览体验。继续浏览本站,即表示您同意我们使用cookie。 详情

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容