k8s-RBAC受权-十六

1、简介html

基于角色的访问控制(“RBAC”)node

http://docs.kubernetes.org.cn/80.htmlvim

(1)api

Kubernetes的受权是基于插件形式的,经常使用的受权插件有如下几种:app

  1. Node:node节点受权
  2. ABAC:基于属性的访问控制
  3. RBAC:基于角色的访问控制
  4. Webhook:自定义http回调方法

RBAC:http://docs.kubernetes.org.cn/148.html学习

  

基于角色的访问控制:如图,先让一个用户(Users)扮演一个角色(Role),让角色(Role)拥有权限,从而让用户拥有这样的权限,而后在受权机制当中,只须要将权限授予某个角色,此时用户将获取对应角色的权限,从而实现角色的访问控制;spa

(2)Role和ClusterRole 插件

  Role是一系列的权限的集合,例如一个Role能够包含读取 Pod 的权限和列出 Pod 的权限, ClusterRole 跟 Role 相似,可是能够在集群中全局使用。3d

  Role只能授予单个namespace 中资源的访问权限。server

  ClusterRole受权 >= Role授予(与Role相似),但ClusterRole属于集群级别对象:

    • 集群范围(cluster-scoped)的资源访问控制(如:节点访问权限)
    • 非资源类型(如“/ healthz”)
    • 全部namespaces 中的namespaced 资源(如 pod)

 (3)RoleBinding和ClusterRoleBinding

RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups ,service accounts),并引用该Role,Role有了权限,用户也就有了权限。RoleBinding在某个namespace 内受权,ClusterRoleBinding适用在集群范围内使用。

   RoleBinding能够引用相同namespace下定义的Role。

  Role和ClusterRole、RoleBinding和ClusterRoleBinding关系以下图:

   

(4)

 使用RoleBinding去绑定ClusterRole:

若是有10个名称空间,每一个名称空间都须要一个管理员,而这些管理员的权限都是一致的。那么此时须要去定义这样的管理员,使用RoleBinding就须要建立10个Role,这样显得很麻烦。为此当使用RoleBinding去绑定一个ClusterRole时,该User仅仅拥有对当前名称空间的集群操做权限,此时只须要建立一个ClusterRole就解决了以上的需求。

 2、RBAC应用

 (1)Role --> User -->Rolebinding 

  用法:

   

  使用kubectl create进行建立角色(role),指定角色名称,--verb指定权限,--resource指定资源或者资源组,--dry-run:此模式不会真的建立;

  a、

   [root@master ~]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml  #先用--dry-run模式看一下role的定义

   

  b、生成资源定义清单

  [root@master ~]# cd manifests/

  #导出yaml文件,稍微编辑一下就能用了
  [root@master manifests]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml >role-demo.yaml

  [root@master manifests]# vim role-demo.yaml

  

  c、建立

  

(2)RoleBinding角色绑定  

建立方法:

使用kubectl create进行建立角色绑定,指定角色绑定的名称,--role|--clusterrole指定绑定哪一个角色,--user指定哪一个用户;  

  a、导出rolebinding资源定义清单文件

  [root@master manifests]# kubectl explain role  #查看资源定义清单字段

  [root@master manifests]# kubectl explain rolebinding  #查看资源定义清单字段

  [root@master manifests]# kubectl create rolebinding magedu-read-pods --role=pods-reader --user=magedu --dry-run -o yaml > rolebinding-demo.yaml

   

  b、建立,将权限受权给用户magedu

  [root@master manifests]# kubectl apply -f rolebinding-demo.yaml

  

  c、可见magedu已经绑定到了pods-reader角色上了;

  

   d、切换用户访问

  

  如今magedu已经有权限访问了;

  以上操做role和rolebinding都是只对当前名称空间生效;

   [root@master ~]# kubectl config use-context kubernetes-admin@kubernetes  #切换回kubernetes-admin用户

 

(2)ClusterRole-->ClusterRoleBinding-->User

  [root@master manifests]# kubectl explain clusterrole  #查看资源定义清单字段

  [root@master manifests]# kubectl explain clusterrolebinding  #查看资源定义清单字段

  a、导出clusterrole的资源定义清单文件

  [root@master manifests]# kubectl create clusterrole cluster-read --verb=get,list,watch --resource=pods -o yaml >clusterrole-demo.yaml

  [root@master manifests]# vim clusterrole-demo.yaml

  

  b、建立clusterrole

  [root@master manifests]# kubectl apply -f clusterrole-demo.yaml 

   此时咱们能够新建一个Linux系统帐户,而后在这个系统帐户下,将kubernetes的用户切换到magedu下,随后对magedu赋予clusterrole的权限;

  

  

  c、此时咱们删除以前建立的rolebinding 解除magedu的权限;

  

  可见此时magedu已经没有了权限;

  

   d、建立clusterrolebinding

  导出yaml资源定义清单文件:

  [root@master ~]# kubectl create clusterrolebinding magedu-read-all-pods --clusterrole=cluster-read --user=magedu --dry-run -o yaml >manifests/clusterrolebinding-demo.yaml

  [root@master manifests]# vim clusterrolebinding-demo.yaml

  

  建立,将magedu绑定到clusterrole:

  [root@master manifests]# kubectl apply -f clusterrolebinding-demo.yaml

  

  查看,可见已经绑定到集群角色:

  

  

  e、此时咱们切换到系统用户为ik8s的窗口,而且kubernetes的用户为maedu

  

  查看其余namespace的pod, 也是能够的:

  

  可是,如今是不能删pod的,由于没有受权:

  

以上可见,对用户magedu进行集群角色绑定,用户magedu将会获取对集群内全部资源的(namespace)对应权限。

 (3)clusterrole --> rolebinding --> user

  将maedu经过rolebinding到集群角色clusterrole中,此时,magedu仅做用于当前名称空间的全部pods资源的权限;

  a、删除以前的clusterrolebinding

  

  b、导出yaml资源定义清单文件

  [root@master manifests]# kubectl create rolebinding magedu-read-pods --clusterrole=cluster-read --user=magedu --dry-run -o yaml >rolebinding-clusterrole-dmeo.yaml

  [root@master manifests]# vim rolebinding-clusterrole-dmeo.yaml

  

  c、建立rolebinding,将magedu绑定到clusterrole

  

  查看rolebinding

  

  可见magedu已经绑定到集群角色clusterrole上了;

  d、此时切换到系统用户ik8s的窗口

  可见magedu能够访问当前namespace的pod,可是不能访问其余namespace的pod;

  由于这种绑定方式,clusterrole是被降级的;

  

 (4)RBAC的三种受权访问方式

RBAC不只能够对user进行访问权限的控制,还能够经过group和serviceaccount进行访问权限控制。user即单个用户,group是对一个组内的user进行受权;

上一节学习了Pod能够经过 spec.serviceAccountName来定义其是以某个serviceaccount的身份进行运行,当咱们经过RBAC对serviceaccount进行访问受权时,便可以实现Pod对其余资源的访问权限进行控制。也就是说,当咱们对serviceaccount进行rolebinding或clusterrolebinding,会使建立Pod拥有对应角色的权限和apiserver进行通讯。

相关文章
相关标签/搜索