当容器服务控制台预置的ClusterRole无法满足您的权限要求时,您可以通过自定义ClusterRole和Role实现更精细化的RBAC权限配置,使您能够根据业务需求和安全要求灵活定制权限策略。本文将为您介绍如何自定义RBAC权限配置。
自定义RBAC权限策略说明
您可以根据以下资源的策略说明,自定义创建Role和ClusterRole的YAML清单,来实现对ACK集群资源的精细访问控制。
Role(命名空间角色)
以下YAML示例定义了一个名为my-role的Role,赋予其在default命名空间中对Pod资源的读取权限。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules: # 权限规则的列表
- apiGroups: [""] # 资源所属的API组
resources: ["pods"] # 定义Pod资源类型
verbs: ["get", "list"] # 定义执行的get、list权限策略
ClusterRole(集群角色)
以下YAML示例定义了一个名为my-clusterrole的ClusterRole,赋予其对集群中的Pods和Services资源的读取权限。
ClusterRole是集群维度的资源,YAML中若指定命名空间参数视为无效。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default
name: my-clusterrole
rules: # 权限规则的列表
- apiGroups: [""] # 资源所属的API组
resources: ["pods"] # 定义pod资源类型
verbs: ["get", "list"] # 定义执行的get、list权限策略
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
您可以根据以下常见资源类型的策略说明,为不同资源创建自定义RBAC权限,以实现对RAM用户或角色在集群资源上更精细的访问控制。
常见资源类型的策略说明
-
读取权限
-
get:读取指定资源的详细信息。 -
list:获取资源集合的列表。 -
watch:监控资源的变化,实时接收更新。
-
-
写入权限
-
create:创建新的资源实例。 -
update:修改已存在的资源。 -
patch:对已存在的资源进行部分修改。 -
delete:删除指定的资源。
-
|
资源名称 |
资源类型(resources) |
所属API组(apiGroups) |
权限策略(verbs) |
|
Pods |
resources: ["pods"] |
|
|
|
Service |
resources: ["services"] |
apiGroups: [""] |
|
|
ConfigMaps |
resources: ["configmaps"] |
apiGroups: [""] |
|
|
Secrets |
resources: ["secrets"] |
apiGroups: [""] |
|
|
PersistentVolumes |
resources: ["persistentvolumes"] |
apiGroups: [""] |
|
|
PersistentVolumeClaim |
resources: ["persistentvolumeclaims"] |
apiGroups: [""] |
|
|
NameSpaces |
resources: ["namespaces"] |
apiGroups: [""] |
|
|
Deployments |
resources: ["deployments"] |
apiGroups: ["apps"] |
|
|
DaemonSet |
resources: ["daemonsets"] |
apiGroups: ["apps"] |
|
|
StatefulSet |
resources: ["statefulsets"] |
apiGroups: ["apps"] |
|
|
Ingresses |
resources: ["ingresses"] |
apiGroups: ["networking.k8s.io"] |
|
|
Networkpolicies |
resources: ["networkpolicies"] |
apiGroups: ["networking.k8s.io"] |
|
|
Jobs |
resources: ["jobs"] |
apiGroups: ["batch"] |
|
|
CronJobs |
resources: ["cronjobs"] |
apiGroups: ["batch"] |
|
|
StorageClasses |
resources: ["storageclasses"] |
apiGroups: ["storage.k8s.io"] |
|
|
HorizontalPodAutoscalers |
resources: ["horizontalpodautoscalers"] |
apiGroups: ["autoscaling"] |
|
操作步骤
您可以通过控制台或kubectl使用自定义RBAC权限。
当前容器服务 Kubernetes 版控制台操作方式仅支持自定义ClusterRole角色与集群内RBAC权限的绑定,如果您需要使用自定义Role角色进行权限绑定,可使用kubectl命令完成。
控制台
步骤一:创建自定义RBAC权限
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
-
在角色页面,单击Cluster Role页签。然后单击创建。
-
在创建 YAML面板输入自定义策略的YAML内容,单击确定即可创建ClusterRole。
此步骤以ClusterRole(集群角色)的YAML为例,创建完成后,可在Cluster Role页签查看自定义权限my-clusterrole。

步骤二:使用自定义RBAC权限进行授权
登录容器服务管理控制台,在左侧导航栏选择授权管理。
-
在授权管理页面配置管理权限。
-
为RAM用户授权:单击RAM 用户页签,定位目标 RAM 用户,单击操作列的管理权限,进入权限管理页面。
-
为RAM角色授权:单击RAM 角色页签,定位目标 RAM 角色,单击管理权限,进入权限管理页面。
-
-
单击+添加权限,在添加权限框中,选择已创建ClusterRole的集群和需要授权的命名空间,然后在权限管理中选择自定义,接着在右边的下拉框中,选择my-clusterrole,然后单击提交授权。

kubectl
步骤一:创建自定义RBAC权限
-
使用以下示例应用的YAML内容,创建名为my-clusterrole.yaml文件。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole namespace: default rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"] -
执行以下命令,部署ClusterRole。
kubectl apply -f my-clusterrole.yaml
步骤二:获取授权对象ID
-
为RAM用户授权,需要通过RAM用户名称获取UserId,详情请参见查询RAM用户的详细信息。
-
为RAM角色授权,需要通过RAM角色名称获取RoleId,详情请参见获取角色信息。
步骤三:使用自定义RBAC权限授权
-
使用以下示例应用的YAML内容,创建名为my-clusterrole-binding.yaml文件。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-clusterrole-binding subjects: - kind: User name: "20811XXXXXXXXX2288" # 步骤二中获取授权对象的UserId或RoleId。 roleRef: kind: ClusterRole name: my-clusterrole apiGroup: rbac.authorization.k8s.io -
执行以下命令,部署ClusterRoleBinding。
kubectl apply -f my-clusterrole-binding.yaml
目标RAM用户被授予自定义RBAC权限后,通过获取目标集群KubeConfig并通过kubectl工具连接集群,以验证其权限。
常见问题
如何授权RAM用户或角色通过控制台登录容器终端?
即使RAM用户或角色拥有对Pod的get和list只读权限,默认情况下也无法通过容器服务管理控制台登录到 Pod 的容器终端。 该操作在RBAC机制中需要Pod子资源 pods/exec 的get和 create 权限。
因此,需在Role或ClusterRole的rules中为 pods/exec 资源授予get和 create 权限,然后将其绑定给目标用户或用户组。示例如下。
操作入口:登录容器服务管理控制台,在集群列表页面单击目标集群名称,在左侧导航栏选择,然后在操作列单击终端。
Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: ns-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# 授予命名空间下 pod/exec 的权限
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]
ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
# 授予集群下 pod/exec 的权限
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]