Role 和 RoleBinding
Role
和 RoleBinding
资源都是命名空间中的资源。前者决定可以针对哪些 URL 路径执行哪些操作;后者将前者与用户主体绑定(当然后者也可以与 ClusterRole
进行绑定,虽然这样还是只能操作 RoleBinding
所在命名空间的 URL 路径)。
创建 Role
Role
是 Kubernetes 中的一种资源,因此可以通过 YAML 定义来生成。如下,在 foo
命名空间中创建一个名为 service-reader
的 Role 对象,该角色规定能够对 services/test-service
资源对象执行 get
和 list
操作:
当然也可以使用 kubectl create role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename] [--dry-run] [options]
命令来创建该资源:
创建 RoleBinding
在创建完 Role
之后,需要创建 RoleBinding
来将 用户主体 与 Role
绑定,从而限制用户主体可以对哪些 URL 路径执行哪些操作。
创建 RoleBinding
同样可以使用 YAML 定义来生成。如下,在 foo
命名空间中创建一个名为 test
的 RoleBinding 对象,其与名为 service-reader
的 Role 对象绑定,并与 foo
命名空间中名为 default
的 ServiceAccount 以及 bar
命名空间中名为 default
的 ServiceAccount 绑定:
当然也可以使用 kubectl create rolebinding NAME --clusterrole=NAME|--role=NAME [--user=username] [--group=groupname] [--serviceaccount=namespace:serviceaccountname] [--dry-run] [options]
命令来创建该资源:
测试
根据上述的创建命令创建完后,会得到下面的关系图,由于 ServiceAccount 均为各自命名空间中的默认 ServiceAccount,因此若 Pod 的 pod.spec.serviceAccountName
没有指定的话,则默认使用其所在命名空间的 default
ServiceAccount。
在命名空间 foo
和 bar
中分别生成一个 Pod,均使用各自命名空间中的默认 ServiceAccount,那么正常情况下,这两个 Pod 将均能通过 API 服务器获得命名空间 foo
中的名为 test-service
的 Service 对象信息。在 Pod 中的测试命令如下(Pod 使用的是 luksa/kubectl-proxy 镜像,内部安装了 kubectl 组件):
从输出结果可以看出,提示的不是没有权限,而是 404 资源不存在,这是因为集群中并没有
test-service
这个资源对象,所以授权是成功的
Last updated
Was this helpful?