ClusterRole 和 ClusterRoleBinding
ClusterRole 和 ClusterRoleBinding 资源都是集群级资源。前者决定可以针对哪些 URL 路径(包括集群级别资源、命名空间级别资源、非资源型 URL)执行哪些操作;后者将前者与用户主体绑定。
管理 ClusterRole 和 ClusterRoleBinding
创建 ClusterRole
ClusterRole 资源属于 Kubernetes 提供的资源类型,可以 YAML 定义进行创建,其共可以对两类 URL 路径进行操作权限控制:
资源(命名空间资源以及集群级资源):在
clusterrole.rules.resources中定义资源;非资源型 URL(/api、/apis、/healthz 等):在
clusterrole.rules.nonresourceURLs中定义非资源型 URL;
下面举一个例子,创建一个名为 pv-reader 的 ClusterRole,该 Role 具备 get 和 list 所有 PV 资源的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole # 类型为 ClusterRole
metadata:
name: pv-reader
rules: # 规则定义
- apiGroups: [""] # 由于 persistentvolumes.apiGroup=v1,即没有 "/","/" 前面是资源所属的组,所以 persistentvolumes 不属于任何组,所以这里为空
resources: ["persistentvolumes"] # 限制的资源类型
verbs: ["get", "list"] # 能够执行 get 和 list 操作
# resourceName: test-pv # 可以指定具体的资源对象
# - nonResourceURLs: # 对非资源型 URL 进行限制,包括 /api, /apis, /healthz
# - /api
# - /apis
# - /healthz
# verbs: ["get"]同时也可以使用 kubectl create clusterrole NAME --verb=verb --resource=resource.group [--resource-name=resourcename] [--non-resource-url=[]] [--dry-run] [options] 命令创建 ClusterRole,如下:
创建 ClusterRoleBinding
ClusterRoleBinding 资源属于 Kubernetes 提供的资源类型,可以 YAML 定义进行创建。例如,创建一个名为 pv-test 的 ClusterRoleBinding,并将名为 pv-reader 的 ClusterRole 与命名空间 foo 中的 default ServiceAccount 进行绑定:
同时也可以使用 kubectl create clusterrolebinding NAME --clusterrole=NAME [--user=username] [--group=groupname] [--serviceaccount=namespace:serviceaccountname] [--dry-run] [options] 命令来创建 ClusterRoleBinding,如下:
测试
根据上述的创建命令创建完后,会得到下面的关系图,由于 ServiceAccount 为命名空间中的默认 ServiceAccount,因此若 Pod 的 pod.spec.serviceAccountName 没有指定的话,则默认使用其所在命名空间的 default ServiceAccount。

在命名空间 foo 中生成一个 Pod,使用命名空间中的默认 ServiceAccount,那么正常情况下,这个 Pod 将能通过 API 服务器获得集群资源中的所有的 PV 对象信息。在 Pod 中的测试命令如下(Pod 使用的是 luksa/kubectl-proxy 镜像,内部安装了 kubectl 组件):
从输出结果可以看出,在 iterms 中详细列出了所有 PV 资源对象的详细信息
集群中默认的 ClusterRole 和 ClusterRoleBinding
Kubernetes 提供了一些默认的 ClusterRole 资源和 ClusterRoleBinding 资源,每次 API 服务器重启时都会重置它们,因为这样可以保证若用户由于错误操作修改了权限配置,导致默认的 ServiceAccount 不安全时,在重启后即可解决该问题。
默认的 ClusterRole 和 ClusterRoleBinding 资源如下:
其中比较重要的 ClusterRole 有 view、edit、admin 以及 cluster-admin。
view 允许对资源的只读访问
可以通过 kubectl describe clusterrole view 查看其定义。
它允许 get, list, watch 大多数命名空间级别的资源,除了 Role、RoleBinding 以及 Secret 资源。
edit 允许对资源的修改
可以通过 kubectl describe clusterrole edit 查看其定义。
它允许对命名空间级别的资源进行修改,同时允许读取和修改 Secret 资源,但是不能查看或修改 Role 和 RoleBinding 资源。
admin 赋予一个命名空间全部控制权
可以通过 kubectl describe clusterrole admin 查看其定义。
它允许对命名空间级别的所有资源进行读取和修改。
cluster-admin 得到完全控制
可以通过 kubectl describe clusterrole cluster-admin 查看其定义:
它允许对 Kubernetes 集群的完全控制权限。
Last updated
Was this helpful?