RBAC 全称 Role Based Access Control,Kubernetes是基于角色访问控制实现授权决策。管理员可通过 Kubernetes API 动态配置权限策略。
RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。可以通过 kubectl 工具查看管理描述对象。
1
2
3
4
kubectl get role
kubectl get clusterrole
kubectl get rolebinding
kubectl get clusterrolebinding
角色
Kubernetes 中角色分为两种:Role 和 ClusterRole。如果你希望在命名空间内定义角色,应该使用 Role; 如果你希望定义集群范围的角色,应该使用 ClusterRole。
Role
Role 用于给某个 namespace 中的资源鉴权使用, 在创建 Role 的时候必须指定该 Role 所属的命名空间。可以定义一组权限集合,例如:授予对 Pod 的读取访问权限:
1
2
3
4
5
6
7
8
9
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: role-pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
ClusterRole
ClusterRole 是集群作用域的资源定义访问权限,可以跨所有的命名空间授权,可以授予集群范围的资源权限比如 node。
1
2
3
4
5
6
7
8
9
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
name: role-nodes-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "watch", "list"]
参数
apiGroup 可配置参数有:””,”apps”, “autoscaling”, “batch”。
resources 可配置的参数有:”services”, “endpoints”, “pods”,”secrets”,”configmaps”,”crontabs”, “deployments”,”jobs”, “nodes”, “rolebindings”, “clusterroles”, “daemonsets”, “replicasets”, “statefulsets”, “horizontalpodautoscalers”, “replicationcontrollers”, “cronjobs”。
verbs 可配置的参数有:”get”, “list”, “watch”, “create”, “update”, “patch”, “delete”, “exec”。
角色绑定
RoleBinding 和 ClusterRoleBinding 是将角色中定义的权限赋予一个或一组用户。
- 一个 RoleBinding 可以引用同一 namespace 中的任何 Role。
- 一个 RoleBinding 可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的 namespace。
- 如果你希望将某 ClusterRole 绑定到集群中所有 namespace,你要使用 ClusterRoleBinding。
示例
通过 roleRef 指定某个 Role 的绑定关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "hello" 读取 "default" 名字空间中的 Pods
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User # 这里可以是 User、Group、ServiceAccount
name: hello
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # 这里必须是 Role 或 ClusterRole
name: role-pod-reader # 绑定的 Role 或 ClusterRole 的名称
apiGroup: rbac.authorization.k8s.io