RBAC介绍
在Kubernetes中,所有资源对象都是通过API进行操作,他们保存在etcd里。
而对etcd的操作我们需要通过访问 kube-apiserver 来实现,上面的Service Account其实就是APIServer的认证过程,而授权的机制是通过RBAC:基于角色的访问控制实现。
RBAC有四个资源对象
- Role
- ClusterRole
- RoleBinding
- ClusterRoleBinding
Role:角色
https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/
一组权限的集合,在一个命名空间中,可以用其来定义一个角色,只能对命名空间内的资源进行授权。
如果是集群级别的资源,则需要使用ClusterRole。
例如:定义一个角色用来读取Pod的权限
vim role.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-read
namespace: rbac
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
resourceNames:
- pod-test
rules中的参数说明:
1、apiGroups:支持的API组列表, ""
表示核心 API 组,*
表示所有 API 组。例如:"apiVersion: apps/v1"中的apps或者rbac.authorization.k8s.io/v1中的rbac.authorization.k8s.io等
2、resources:支持的资源对象列表,例如pods、deployments、jobs等
3、resourceNames: 指定resource中的可使用项,例如上面的resources是pods,设置了resourceNames,就表示可操作resourceNames匹配到的pod,不设置(忽略)这个字段,则表示匹配所有的
4、verbs:对资源对象的操作方法列表。例如"update", "get", "watch", "list","create", "delete", "deletecollection", "patch","bind","get", "post"
ClusterRole:集群角色
具有和角色一致的命名空间资源的管理能力,还可用于以下特殊元素的授权
1、集群范围的资源,例如 Node
2、非资源型的路径,例如:/healthz
3、包含全部命名空间的资源,例如Pods
例如:定义一个集群角色可让用户访问任意secrets
vim clusterrole.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secrets-clusterrole
rules:
- apiGroups:
- ""
resources:
- secrets
verbs:
- list
- get
- watch
RoleBinding:角色绑定、ClusterRolebinding:集群角色绑定
角色绑定和集群角色绑定用于把一个角色绑定在一个目标上
可以是User,Group,ServiceAccount,使用RoleBinding为某个命名空间授权,使用ClusterRoleBinding为集群范围内授权。
例如:将在rbac命名空间中把pod-read角色授予用户es
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-read-bind
namespace: rbac
subjects:
- kind: User
name: es
apiGroup: rbac.authorization.k8s.io
roleRef:
- kind: Role
name: pod-read
apiGroup: rbac.authorizatioin.k8s.io
RoleBinding也可以引用ClusterRole,对属于同一命名空间内的ClusterRole定义的资源主体进行授权
例如:es能获取到集群中所有的资源信息
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: es-allresource
namespace: rbac
subjects:
- kind: User
name: es
apiGroup: rbac.authorization.k8s.io
roleRef:
- apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
- subjects: 指定被绑定的资源,上面被绑定的对象是User
- kind是资源的类型 User,Group,ServiceAccount
- apiGroup 是资源所属的apiversion组
- namespace 用户名空间。如果对象类型
kind
为User或Group时,一定不要配置namespace,否则会报错。
- roleRef:指定绑定的角色或集群角色 这里是集群角色
- kind 是角色的类型
- apiGroup 是角色所属的apiversion组 一般都是`rbac.authorization.k8s.io