首先需要了解ServiceAccount。ServiceAccount顾名思义就是账户,pod使用这个账户和API服务器进行交互,API服务器能对这个账户进行认证(确定你是谁),然后对这个账户进行授权(你能干些什么)。
每个命名空间都有默认的ServiceAccount。在创建pod时,如果没有明确指定ServiceAccount将会使用默认的serviceAccount。若要创建一个ServiceAccount,可以使用如下的命令
kubectl create serviceaccount foo
ServiceAccount会关联一个Secret,可以通过
kubectl describe sa
查看Secret的名称。这个Secret包含3部分内容
ca.crt
namespace
token
ca.crt用于认证API服务器,token用于让API服务器认证自己。最终这个Secret会被挂载到
/var/run/secrets/kubernetes.io/serviceaccount目录下。
通过在pod定义文件中的spec.serviceAccountName字段上设置ServiceAccount的名称来为pod指定ServiceAccount。
RBAC权限模型是一个比较常见的权限模型,主要包括以下一些概念
在k8s中,资源包括pod, replicaSet, deployment等对象。ServiceAccount对应上面提到的用户。动作如创建资源,修改资源,删除资源等。k8s中的动词和HTTP方法之间的映射关系如下
HTTP方法 |
单一资源的动词 |
集合的动词 |
GET、HEAD |
get(以及watch用于监听) |
list(以及watch) |
POST |
create |
n/a |
PUT |
update |
n/a |
PATCH |
patch |
n/a |
DELETE |
delete |
deletecollection |
此外,k8s还有以下一些资源,是和角色、角色绑定相关的。包括
Role的yaml文件如下所示
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: foo
name: role-test
rules:
- apiGroups: [""]
verbs: ["get", "list"]
resources: ["services"]
RoleBinding的yaml文件如下所示
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: foo
name: test-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role-test
subjects:
- kind: ServiceAccount
name: default
namespace: foo
可以通过如下命令将ServiceAccount和角色绑定(创建rolebinding)
kubectl create rolebinding test --role=role-test --serviceaccount=foo:default -n foo
如果要绑定一个角色到一个user(用户)而不是ServiceAccount,使用--user作为参数制定用户名,绑定角色到组,可以使用--group参数
关于role, clusterRole, roleBinding, clusterRoleBinding有以下一些注意点
访问的资源 |
使用的角色类型 |
使用的绑定类型 |
集群级别的资源 |
ClusterRole |
ClusterRoleBinding |
非资源型URL |
ClusterRole |
ClusterRoleBinding |
在任何命名空间中的资源(和跨所有命名空间的资源) |
ClusterRole |
ClusterRoleBinding |
在具体命名空间中的资源(在多个命名空间中重用这个相同的ClusterRole) |
ClusterRole |
RoleBinding |
在具体命名空间中的资源(Role必须在每个命名空间中定义好) |
Role |
RoleBinding |
通过以下命令可以查看默认的集群角色和绑定
kubectl get clusterrolebindings
kubectl get clusterroles