
# 集群中Kubernetes资源权限（Kubernetes RBAC授权）
集群中Kubernetes资源权限是基于Kubernetes RBAC能力的授权，通过权限设置可以让不同的用户或用户组拥有操作不同Kubernetes资源的权限。Kubernetes RBAC API定义了四种类型：Role、ClusterRole、RoleBinding与ClusterRoleBinding，这四种类型之间的关系和简要说明如下：
- **Role：**角色，其实是定义一组对Kubernetes资源（命名空间级别）的访问规则。
- **RoleBinding：**角色绑定，定义了用户和角色的关系。
- **ClusterRole：**集群角色，其实是定义一组对Kubernetes资源（集群级别，包含全部命名空间）的访问规则。
- **ClusterRoleBinding：**集群角色绑定，定义了用户和集群角色的关系。
Role和ClusterRole指定了可以对哪些资源做哪些动作，RoleBinding和ClusterRoleBinding将角色绑定到特定的用户、用户组或ServiceAccount上。如下图所示。
图1角色绑定   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002228613109.png "点击放大")
在UCS控制台可以授予用户或用户组命名空间权限，可以对某一个命名空间或全部命名空间授权，UCS控制台默认提供如下ClusterRole。
- view（只读权限）：对所有命名空间或所选命名空间下大多数Kubernetes资源的RBAC只读权限。
- edit（开发权限）：对所有命名空间或所选命名空间下多数Kubernetes资源的RBAC读写权限。
- admin（运维权限）：对所有命名空间下大多数Kubernetes资源的RBAC读写权限，对集群节点（node）、存储卷（PV）、命名空间（namespace）、配额（resourcequota）的只读权限。
- cluster-admin（管理员权限）：对所有命名空间下Kubernetes资源的RBAC读写权限，以及对集群节点（node）、存储卷（PV）、命名空间（namespace）、配额（resourcequota）的读写权限。
 
除了使用上述常用的ClusterRole外，您还可以通过定义Role和RoleBinding来进一步对全局资源（如Node、PersistentVolumes、CustomResourceDefinitions等）和命名空间中不同类别资源（如Pod、Deployment、Service等）的增删改查权限进行配置，从而做到更加精细化的权限控制。
#### 注意事项
- 任何用户创建集群/容器舰队后，UCS会自动为该用户添加该集群/容器舰队的所有命名空间的cluster-admin权限，也就是说该用户允许对该集群/容器舰队以及该集群/容器舰队下所有命名空间中的全部资源进行完全控制。联邦用户由于每次登录注销都会改变用户ID，所以权限用户会显示已删除，此情况下请勿删除该权限，否则会导致鉴权失败。此种情况下建议在UCS为某个用户组创建cluster-admin权限，将联邦用户加入此用户组。
- 拥有Security Administrator（IAM除切换角色外所有权限）权限的用户（如账号所在的admin用户组默认拥有此权限），才能在UCS控制台命名空间权限页面进行授权操作。
 
 #### 添加资源权限（控制台）
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/notice_3.0-zh-cn.png)
添加权限集群状态需为"运行中"，容器舰队需已开通集群联邦能力。
集群中Kubernetes资源权限是基于Kubernetes RBAC能力的授权，通过权限设置可以让不同的用户或用户组拥有操作不同Kubernetes资源的权限。
1. 登录[UCS控制台](https://console.huaweicloud.com/ucs/?#/aether/dashboard)，在左侧导航栏中选择"权限管理"。
2. 在右边下拉列表中选择要添加权限的集群/容器舰队。
3. 在右上角单击"添加权限"，进入添加权限页面。
4. 在添加权限页面，确认集群/容器舰队名称，选择该集群/容器舰队下要授权使用的命名空间，例如选择"全部命名空间"，选择要授权的用户或用户组，再选择具体权限。 
   ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
   对于没有IAM权限的用户，给其他用户和用户组配置权限时，无法选择用户和用户组，此时支持填写用户ID或用户组ID进行配置。
   图2配置命名空间权限   
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002231851537.png "点击放大")
   
   表1权限类型配置说明 
   | 权限类型  | 权限说明                                                                                                                                                                                                               |
   |:---|:---|
   | 管理员权限 | 对所有命名空间下Kubernetes资源的RBAC读写权限，以及对集群节点（node）、存储卷（PV）、命名空间（namespace）、配额（resourcequota）的读写权限 须知： UCS FullAccess 不直接具有CCE集群的RBAC权限，需要用户到权限管理页面进行CCE集群授权。 |
   | 运维权限  | 对所有命名空间下大多数Kubernetes资源的RBAC读写权限，对集群节点（node）、存储卷（PV）、命名空间（namespace）、配额（resourcequota）的只读权限                                                                                                                        |
   | 开发权限  | 对所有命名空间或所选命名空间下多数Kubernetes资源的RBAC读写权限                                                                                                                                                                             |
   | 只读权限  | 对所有命名空间或所选命名空间下大多数Kubernetes资源的RBAC只读权限                                                                                                                                                                            |
   | 自定义权限 | 权限由您所选择的ClusterRole或Role决定，请在确定所选ClusterRole或Role对各类资源的操作权限后再进行授权，以免子用户或用户组获得不符合预期的权限                                                                                                                              |
      
   其中自定义权限可以根据需要自定义，选择自定义权限后，在自定义权限一行右侧单击新建自定义权限，在弹出的窗口中填写名称并选择规则。创建完成后，在添加权限的自定义权限下拉框中可以选择。
   自定义权限分为ClusterRole或Role两类，ClusterRole或Role均包含一组代表相关权限的规则，详情请参见[使用RBAC鉴权](https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/)。
   - ClusterRole：ClusterRole是一个集群级别的资源，可设置集群的访问权限。
   
   - Role：Role用于在某个命名空间内设置访问权限。当创建Role时，必须指定该Role所属的命名空间。
   
   
   图3自定义权限   
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002193327262.png "点击放大")
   
   
   
5. 单击"确定"，添加权限。
 
 #### 自定义配置集群中Kubernetes资源权限（kubectl）
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
kubectl访问集群是通过集群上生成的配置文件（kubeconfig.json）进行认证，kubeconfig.json文件内包含用户信息，根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig.json文件，kubeconfig.json就拥有哪个用户的信息，这样使用kubectl访问时就拥有这个用户的权限。而用户拥有的权限就是[UCS服务资源权限（IAM授权）与集群中Kubernetes资源权限（Kubernetes RBAC授权）的关系](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0010.html#ucs_01_0010__section322351221619)所示的权限。
除了使用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 鉴权](https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/)。
有了Role之后，就可以将Role与具体的用户绑定起来，实现这个的就是RoleBinding了。如下所示。
```
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: RoleBinding-example
  namespace: default
  annotations:
    CCE.com/IAM: 'true'    # CCE集群需要该annotation参数，其他类型集群不需要
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里面定义的权限，如下图所示。
图4RoleBinding绑定Role和用户   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0262051194.png "点击放大")
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包含全部命名空间下所有资源的读写权限。
图5授予集群管理员权限（cluster-admin）
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002216023866.png "点击放大")
图6授予容器舰队管理员权限（cluster-admin）
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002250985213.png "点击放大")
#### 示例：授予命名空间运维权限（admin）
admin权限拥有命名空间大多数资源的读写权限，您可以授予用户/用户组全部命名空间admin权限。
图7授予某集群全部命名空间运维权限（admin）
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002251339337.png "点击放大")
图8授予某容器舰队全部命名空间运维权限（admin）
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002216024982.png "点击放大")
#### 示例：授予命名空间开发权限（edit）
edit权限拥有命名空间大多数资源的读写权限，您可以授予用户/用户组全部命名空间edit权限。
图9授予集群default命名空间开发权限（edit）   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002251005361.png "点击放大")
图10授予容器舰队default命名空间开发权限（edit）   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002251004289.png "点击放大")
#### 示例：授予多命名空间只读权限（view）
view权限拥有命名空间查看权限，您可以给某个、多个或全部命名空间授权。
图11授予集群多命名空间只读权限（view）   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002251008065.png "点击放大")
图12授予舰队多命名空间只读权限（view）
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002251008717.png "点击放大")
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
添加权限时，命名空间可多选，但选择全部命名空间时，不能再选其他命名空间。
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002304604953.png "点击放大")
#### 示例：授予某类Kubernetes资源权限
上面几个示例都是集群/容器舰队全部资源（cluster-admin）、命名空间全部资源（admin、view），也可以对某类Kubernetes资源授权，如Pod、Deployment、Service这些资源，具体请参见[自定义配置集群中Kubernetes资源权限（kubectl）]。
