1、簡介html
基於角色的訪問控制(「RBAC」)node
http://docs.kubernetes.org.cn/80.htmlvim
(1)api
Kubernetes的受權是基於插件形式的,經常使用的受權插件有如下幾種:app
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屬於集羣級別對象:
(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進行通訊。