一、概述
RBAC: Role-Based Access Control,基于角色的权限控制。
从kubernetes1.6版本起,RBAC成为kubernetes默认的访问控制策略。
RBAC主要包含以下概念:
Role:角色,角色定义了一组权限的集合,例如只读权限,读写权限
Subject:主体,主体是角色,可以是用户,也可以是ServiceAccount,在实际使用中,主体通常是ServiceAccount。
RoleBinding:定义了角色和主体之间的绑定关系。
关系图:
二、Role & ClusterRole
kubernetes有role以及clusterrole两种角色,简单来说就是role是受namespace制约的,role的作用仅在指定的namespace中生效,而clusterrole是定义到整个集群作用域上,不受namespace的制约,也就是clusterrole是对整个k8s集群生效的。
我们来定义一个role:
准备role的yaml文件---nginx_role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: scm-tools
name: nginx-pod-reader
rules:
# 表示对核心api group中的pod资源有只读的权限
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# 表示对"batch"以及"extensions" api group中的job资源有读写权限
- apiGroups: ["batch", "extensions"]
resources: ["jobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
创建role:
kubectl apply -f nginx_role.yaml
我们定义了一个role,名称是nginx-pod-reader,属于scm-tools这个namespace,对核心api组下的pod资源拥有 get、list、watch操作权限,对batch和extensions api组中的job资源拥有["get", "list", "watch", "create", "update", "patch", "delete"] 一系列读写权限。
查看刚刚创建的role:
[root@scm-master nginx]# kubectl get role -n scm-tools | grep nginx-pod-reader
nginx-pod-reader 70m
再来看看clusterrole,clusterrole和role的区别在于作用域不同。
准备ClusterRole的yaml文件---cluster_role.yaml:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# ClusterRole不受namespace的制约,这里不需要指定namespace
name: secrets-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
创建ClusterRole:
kubectl apply -f cluster_role.yaml
查看创建的ClusterRole:
[root@scm-master nginx]# kubectl get clusterrole | grep secrets-reader
secrets-reader 52m
三、ServiceAccount
ServiceAccount是提供给服务使用的一个账号,创建比较简单,我们来看看它的yaml文件:
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: scm-tools
name: nginx-svc-acc
创建ServiceAccount:
kubectl apply -f nginx_svc_acc.yaml
查看创建的ServiceAccount:
[root@scm-master nginx]# kubectl get sa -n scm-tools | grep nginx
nginx-svc-acc 1 5m58s
四、RoleBinding & ClusterRoleBinding
RoleBinding和ClusterRoleBinding 是将 Role、ClusterRole和相应的ServiceAccount绑定起来,使得ServiceAccount具有Role中描述的相关权限来访问k8s集群中对应的资源
准备RoleBinding的yaml文件---role_binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
# 这个角色绑定允许 "scm-nginx" 服务账号在 "scm-tools" 命名空间中有读取pod 的权限。
kind: RoleBinding
metadata:
name: read-pods
namespace: scm-tools # 这里只授予 "scm-tools" 命名空间的权限。
subjects:
- kind: ServiceAccount
name: nginx-svc-acc
apiGroup: ""
roleRef:
kind: Role
name: nginx-pod-reader
apiGroup: rbac.authorization.k8s.io
创建rolebinding:
kubectl apply -f role_binding.yaml
查看创建的rolebinding:
[root@scm-master nginx]# kubectl get rolebinding -n scm-tools | grep read-pods
read-pods 21s
同理创建ClusterRoleBinding也是类似的,ClusterRoleBinding的yaml文件:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-pods-cluster-role
subjects:
- kind: ServiceAccount
name: nginx-svc-acc
namespace: scm-tools
apiGroup: ""
roleRef:
kind: ClusterRole
name: secrets-reader
apiGroup: rbac.authorization.k8s.io
五、为pod分配ServiceAccount
上面的步骤都完成之后,我们就要为pod分配已经完成角色绑定的ServiceAccount了,使得pod能够使用ServiceAccount中拥有的对k8s资源的操作权限, 这里以nginx的deployment.yaml为例,可能nginx并不需要设置RBAC策略,仅仅是在此处作为示例展示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
namespace: scm-tools
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
serviceAccountName: nginx-svc-acc
创建deployment之后,我们查看nginx的pod:
kubectl edit po nginx-deployment-5c9786c4dd-54v7d -n scm-tools
可以看到ServiceAccount已经添加到pod中了,ServiceAccount具备的权限也随之生效了。
参考资料: