一、前言¶
本文主要以下几方面介绍k8s中的RBAC:
- RBAC是什么
- RBAC出现背景
- RBAC对象分类
- RBAC对象配置解析
- RBAC配置示例
- RBAC角色分类
- 使用命令行工具创建RBAC对象
- 聚合ClusterRole
- RBAC企业实践
二、RBAC是什么¶
基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对计算机或网络资源的访问的方法。其在Kubernetes 1.5版本中引入,在1.6版本中升级为Beta版本,并成为Kubeadm安装方式下的默认选项。
RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组来驱动鉴权决定, 允许你通过 Kubernetes API 动态配置策略。
要启用 RBAC,在启动 API 服务器时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC。
kube-apiserver --authorization-mode=Example,RBAC --<其他选项> --<其他选项>
其中关于两种安装方式的配置文件路径如下:
- 二进制方式安装:/usr/lib/systemd/system/kube-apiserver.service
- kubeadm方式安装:/etc/kubernetes/manifests/kube-apiserver.yml
根据不同的安装方式,在对应的配置文件中添加--authorization-mode=Node,RBAC参数。
三、RBAC出现背景¶
在生产环境中,Kubernetes管理员具有Kubernetes集群中各类资源增删改查的权限,并且也具有授权其他用户权限的权限。之前提到过使用kubectl客户端工具操作集群时,会默认使用~/.kube/config文件访问集群,该文件具有操作集群的各类权限,有可能是管理员权限,也有可能只是某个命名空间的权限。在实际使用时,需要访问并操作Kubernetes集群的不仅仅是管理员,也有可能是某个项目的负责人、某个应用的开发者等,所以在Kubernetes中实现细粒度的权限管理是一件很重要的事情,而具体权限的管控都由一个叫RBAC的资源进行管理配置。
四、RBAC对象分类¶
RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。你可以像使用其他 Kubernetes 对象一样, 通过类似 kubectl 这类工具描述或修补RBAC 对象。

4.1 Role 和 ClusterRole¶
RBAC 的 Role 或 ClusterRole 中包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。
Role 总是用来在某个名字空间内设置访问权限; 在你创建 Role 时,你必须指定该 Role 所属的名字空间。
与之相对,ClusterRole 则是一个集群作用域的资源。这两种资源的名字不同(Role 和 ClusterRole) 是因为 Kubernetes 对象要么是名字空间作用域的,要么是集群作用域的,不可两者兼具。
ClusterRole 有若干用法。你可以用它来:
- 定义对某名字空间域对象的访问权限,并将在个别名字空间内被授予访问权限;
- 为名字空间作用域的对象设置访问权限,并被授予跨所有名字空间的访问权限;
- 为集群作用域的资源定义访问权限。
小结:Role和ClusterRole的关键区别是,Role是作用于命名空间内的角色,ClusterRole是作用于整个集群的集群角色。在RBAC API中,Role包含表示一组权限的规则。权限纯粹是附加允许的,没有拒绝规则。
4.2 RoleBinding 和 ClusterRoleBinding¶
角色绑定(Role Binding)是将角色中定义的权限赋予一个或者一组用户。 它包含若干主体(Subject)(用户、组或服务账户)的列表和对这些主体所获得的角色的引用。 RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。
一个 RoleBinding 可以引用同一的名字空间中的任何 Role。 或者,一个 RoleBinding 可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的名字空间。 如果你希望将某 ClusterRole 绑定到集群中所有名字空间,你要使用 ClusterRoleBinding。
RoleBinding 或 ClusterRoleBinding 对象的名称必须是合法的路径分段名称。
小结:RoleBinding和ClusterRoleBinding最大的区别与Role和ClusterRole的区别类似,即RoleBinding作用于命名空间,ClusterRoleBinding作用于集群。