前文咱們瞭解了k8s上的訪問控制機制,主要對訪問控制中的第一關用戶認證作了相關說明以及常規用戶的配置文件的製做,回顧請參考:http://www.javashuo.com/article/p-gocttrgh-ny.html;今天咱們來了解下k8s上的訪問控制第二關RBAC受權相關話題;html
在k8s上受權的機制有不少,最經常使用的有ABAC和RBAC;ABAC(attribute based access control)這種是基於屬性作訪問控制;RBAC(role based access control)這種是基於角色作訪問控制;所謂基於屬性作訪問控制是指,對k8s上的資源的某種屬性作受權,受權給相關用戶對該資源的某個屬性有什麼權限;一樣的邏輯基於角色作訪問控制就是指把k8s上的資源,受權給對應角色有什麼權限;那角色和用戶有什麼關係呢?對於RBAC受權模型來講,在k8s上用戶是無法直接關聯資源;它是經過角色對象來實現對資源的受權;用戶受權是經過角色綁定對象來關聯到對應角色;只要用戶綁定到對應角色,那麼該用戶就擁有綁定角色上的全部權限;好比,在k8s上有一個角色名爲pod-reader,這個角色可以對default名稱空間下的pod資源有隻讀權限;對其餘名稱空間任何資源沒有任何權限;若是一個用戶綁定到該角色上,對應用戶就有對default名稱空間下的pod資源擁有隻讀權限,對其餘名稱空間任何資源沒有任何權限;對於k8s上的資源來講,資源有兩個級別,一個是名稱空間級別的資源,一個是集羣級別的資源;好比pod,svc,pvc等等這些資源都是名稱空間級別資源,它們的存在必須是在某個名稱空間下;對於相似像pv,node,ns這些資源就是集羣級別資源,它們的存在不依賴任何名稱空間;這樣一來對於角色而言就有名稱空間級別的角色,也有集羣級別角色;名稱空間級別的角色就是用來定義特定名稱空間下的資源權限,集羣級別角色就是用來定義整個集羣上的資源權限;在k8s上這兩種角色分別叫role和clusterrole;role和clusterrole都是k8s上的資源,咱們要給某個用戶受權,首先把對應角色資源實例化爲一個角色對象,而後把用戶和角色對象綁定起來便可;用戶怎麼綁定到角色上呢?在k8s上綁定這個操做也是經過資源對象實現的;綁定也有兩種,一種是rolebinding,一種是clusterrolebinding;rolebinding是名稱空間級別資源,它主要用來把對應用戶和對應名稱空間上的角色(role)作綁定;對應用戶就能擁有對應角色在對應名稱空間下對應資源的權限;clusterrolebinding主要用來把用戶綁定到集羣級別角色(clusterrole)上,對應用戶就能擁有對整個集羣上的對應角色擁有的對應資源的權限;簡單講角色(role/clusterrole)就是用來定義資源的權限,rolebinding和clusterrolebinding是用來關聯用戶和角色的關係;以下圖所示;node
提示:這裏須要注意一點,clusterrole是包含名稱空間級別的role;也就是說clusterrole既能夠用clusterrolebinding來綁定,也能夠用rolebinding來綁定,若是rolebinding綁定的是一個集羣級別的角色(clusterrole)那麼對應綁定至clusterrole的用戶的權限就會縮小到對應名稱空間下,而非整個集羣,緣由是rolebinding是名稱空間級別資源;nginx
查看apiserver啓用受權插件web
提示:apiserver配置啓用RBAC插件須要用--authorization-mode選項來指定對應啓用的受權插件,在k8s1.6之後的版本,默認apiserver會啓用Node和RBAC受權插件;bootstrap
建立角色api
使用陳述時命令create,建立角色的語法格式bash
Usage: kubectl create role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename] [--dry-run=server|client|none] [options]
提示:以上create role表示建立的是名稱空間級別的角色,若是沒有指定其名稱空間表示默認名稱空間;--verb是用來指定對應的權限,好比get,list,watch等等;--resource使用來指定資源資源類型,好比pods,services,daemonsets,replicasets等等;--resource-name用來指定對應具體的資源的名稱;若是要指定名稱空間使用-n選項指定便可;默認不指定表示default名稱空間;app
示例:使用陳述時命令建立名爲pod-reader的角色,該角色擁有對default名稱空間下的pod資源有list,get和watch權限;工具
[root@master01 ~]# kubectl create role pod-reader --verb=list --verb=get --verb=watch --resource=pods role.rbac.authorization.k8s.io/pod-reader created [root@master01 ~]# kubectl get role NAME CREATED AT pod-reader 2020-12-31T11:27:39Z [root@master01 ~]# kubectl describe role pod-reader Name: pod-reader Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [list get watch] [root@master01 ~]#
提示:能夠看到pod-reader角色對pods資源有list,get,watch權限;編碼
使用陳述式命令建立clusterrole
命令使用語法格式
Usage: kubectl create clusterrole NAME --verb=verb --resource=resource.group [--resource-name=resourcename] [--dry-run=server|client|none] [options]
提示:使用語法和建立名稱空間級別的角色同樣,不一樣的是指定建立的是clusterrole;
示例:建立一個名爲cluster-pods-reader角色,擁有對集羣全部名稱空間下的pods和servers資源有get,list,watch權限;
[root@master01 ~]# kubectl create clusterrole cluster-pods-reader --verb=get --verb=list --verb=watch --resource=pods --resource=services clusterrole.rbac.authorization.k8s.io/cluster-pods-reader created [root@master01 ~]# kubectl get clusterrole cluster-pods-reader NAME CREATED AT cluster-pods-reader 2020-12-31T11:35:03Z [root@master01 ~]# kubectl describe clusterrole cluster-pods-reader Name: cluster-pods-reader Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get list watch] services [] [] [get list watch] [root@master01 ~]#
提示:能夠看到cluster-pods-reader角色有對pods資源和services資源有get,list,watch權限;
建立rolebinding
命令語法格式
Usage: kubectl create rolebinding NAME --clusterrole=NAME|--role=NAME [--user=username] [--group=groupname] [--serviceaccount=namespace:serviceaccountname] [--dry-run=server|client|none] [options]
提示:建立rolebinding須要指定對應的名稱,指定clusterrole或者role角色的名稱,指定對應的用戶名稱,或者對應的組名;若是對應用戶是sa帳號,須要用--serviceaccount選項來指定對應sa的名稱;sa的名稱由名稱空間:sa名稱;若是要指定名稱空間使用-n選項指定便可;默認不指定表示default名稱空間;
示例:建立名爲tom-pods-reader的rolebinding,其中指定對應tom用戶綁定至pod-reader角色
[root@master01 ~]# kubectl create rolebinding tom-pods-reader --role=pod-reader --user=tom rolebinding.rbac.authorization.k8s.io/tom-pods-reader created [root@master01 ~]# kubectl get rolebinding NAME ROLE AGE tom-pods-reader Role/pod-reader 5s [root@master01 ~]# kubectl describe rolebinding tom-pods-reader Name: tom-pods-reader Labels: <none> Annotations: <none> Role: Kind: Role Name: pod-reader Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]#
提示;這裏沒有顯示名稱空間是那個名稱空間;默認沒有顯示就是default名稱空間;
驗證:使用tom用戶的配置文件,看看是否能夠列出default名稱空間下的pod列表呢?
[root@master01 ~]# kubectl config view --kubeconfig=/tmp/myk8s.config apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.0.41:6443 name: myk8s contexts: - context: cluster: myk8s user: tom name: tom@myk8s current-context: tom@myk8s kind: Config preferences: {} users: - name: tom user: client-certificate-data: REDACTED client-key-data: REDACTED username: tom [root@master01 ~]# kubectl get pod --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 44h web-0 1/1 Running 2 2d21h web-1 1/1 Running 2 2d21h web-2 1/1 Running 2 2d21h web-3 1/1 Running 3 2d21h [root@master01 ~]#
提示:能夠看到使用tom用戶的配置文件,使用kubectl工具加載對應配置文件,在default名稱空間下是能夠正常列出pod列表;
驗證:使用tom用戶的配置文件看看是否列出kube-system名稱空間下的pod列表呢?
[root@master01 ~]# kubectl get pod -n kube-system --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "kube-system" [root@master01 ~]#
提示:能夠看到對應tom用戶是沒有權限列出kube-system名稱空間下的pod資源;
建立clusterrolebinding
命令使用語法格式
Usage: kubectl create clusterrolebinding NAME --clusterrole=NAME [--user=username] [--group=groupname] [--serviceaccount=namespace:serviceaccountname] [--dry-run=server|client|none] [options]
提示:使用方式和建立rolebinding同樣,不一樣的是clusterrolebinding不能關聯role角色;
示例:建立名爲tom-all-pod-reader的clusterrolebinding,並關聯cluster-pods-reader角色和tom用戶;
[root@master01 ~]# kubectl create clusterrolebinding tom-all-pod-reader --clusterrole=cluster-pods-reader --user=tom clusterrolebinding.rbac.authorization.k8s.io/tom-all-pod-reader created [root@master01 ~]# kubectl get clusterrolebinding tom-all-pod-reader NAME ROLE AGE tom-all-pod-reader ClusterRole/cluster-pods-reader 20s [root@master01 ~]# kubectl describe clusterrolebinding tom-all-pod-reader Name: tom-all-pod-reader Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: cluster-pods-reader Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]#
驗證:使用tom用戶的配置文件查看kube-system名稱空間下的pod資源列表
[root@master01 ~]# kubectl get pod -n kube-system --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE coredns-7f89b7bc75-k9gdt 1/1 Running 18 23d coredns-7f89b7bc75-kp855 1/1 Running 16 23d etcd-master01.k8s.org 1/1 Running 22 23d kube-apiserver-master01.k8s.org 1/1 Running 17 23d kube-controller-manager-master01.k8s.org 1/1 Running 19 23d kube-flannel-ds-cx8d5 1/1 Running 20 23d kube-flannel-ds-jz6r4 1/1 Running 11 12d kube-flannel-ds-ndzl6 1/1 Running 21 23d kube-flannel-ds-rjtn9 1/1 Running 23 23d kube-flannel-ds-zgq92 1/1 Running 20 23d kube-proxy-cr8j8 1/1 Running 13 11d kube-proxy-h8fzw 1/1 Running 8 11d kube-proxy-jfzfh 1/1 Running 9 11d kube-proxy-rq8wl 1/1 Running 8 11d kube-proxy-sj72v 1/1 Running 8 11d kube-scheduler-master01.k8s.org 1/1 Running 19 23d [root@master01 ~]# kubectl get pod --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 44h web-0 1/1 Running 2 2d21h web-1 1/1 Running 2 2d21h web-2 1/1 Running 2 2d21h web-3 1/1 Running 3 2d22h [root@master01 ~]# kubectl get svc --kubeconfig=/tmp/myk8s.config NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h nginx ClusterIP None <none> 80/TCP 3d [root@master01 ~]# kubectl get svc -n kube-system --kubeconfig=/tmp/myk8s.config NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 23d [root@master01 ~]#
提示:能夠看到把tom用戶用clusterrolebinding關聯到對應clusterrole角色上,就擁有對應角色上的權限;
驗證:使用tom用戶的配置文件查看pv或node集羣級別資源,看看是否能夠正常列出?
[root@master01 ~]# kubectl get pv --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): persistentvolumes is forbidden: User "tom" cannot list resource "persistentvolumes" in API group "" at the cluster scope [root@master01 ~]# kubectl get node --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): nodes is forbidden: User "tom" cannot list resource "nodes" in API group "" at the cluster scope [root@master01 ~]#
提示:使用tom用戶的配置文件查看pv和node資源,apiserver直接拒絕了;緣由是對應的clusterrole角色上沒有查看pv和node的權限;因此對應用戶也就沒有相應的查看權限;
示例:建立rolebinding,把tom用戶關聯到clusterrole類型角色cluster-pods-reader
[root@master01 ~]# kubectl create rolebinding tom-rolebinding-clusterrole --clusterrole=cluster-pods-reader --user=tom rolebinding.rbac.authorization.k8s.io/tom-rolebinding-clusterrole created [root@master01 ~]# kubectl get rolebinding NAME ROLE AGE tom-pods-reader Role/pod-reader 20m tom-rolebinding-clusterrole ClusterRole/cluster-pods-reader 12s [root@master01 ~]# kubectl describe rolebinding tom-rolebinding-clusterrole Name: tom-rolebinding-clusterrole Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: cluster-pods-reader Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]#
驗證:使用tom用戶的配置文件,看看如今tom用戶是否還有對應kube-system中的pod資源有列出權限呢?
[root@master01 ~]# kubectl get pods -n kube-system --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE coredns-7f89b7bc75-k9gdt 1/1 Running 18 23d coredns-7f89b7bc75-kp855 1/1 Running 16 23d etcd-master01.k8s.org 1/1 Running 22 23d kube-apiserver-master01.k8s.org 1/1 Running 17 23d kube-controller-manager-master01.k8s.org 1/1 Running 19 23d kube-flannel-ds-cx8d5 1/1 Running 20 23d kube-flannel-ds-jz6r4 1/1 Running 11 12d kube-flannel-ds-ndzl6 1/1 Running 21 23d kube-flannel-ds-rjtn9 1/1 Running 23 23d kube-flannel-ds-zgq92 1/1 Running 20 23d kube-proxy-cr8j8 1/1 Running 13 11d kube-proxy-h8fzw 1/1 Running 8 11d kube-proxy-jfzfh 1/1 Running 9 11d kube-proxy-rq8wl 1/1 Running 8 11d kube-proxy-sj72v 1/1 Running 8 11d kube-scheduler-master01.k8s.org 1/1 Running 19 23d [root@master01 ~]#
提示:這裏仍是可以列出kube-system名稱空間下的pod,其緣由是咱們沒有刪除以前的clusterrolebinding,因此對應tom用戶還有對kube-system的權限;
驗證:刪除clusterrolebinding tom-all-pod-reader 看看tom用戶是否還有對kube-system中的pod列出權限呢?
[root@master01 ~]# kubectl get clusterrolebinding tom-all-pod-reader NAME ROLE AGE tom-all-pod-reader ClusterRole/cluster-pods-reader 14m [root@master01 ~]# kubectl delete clusterrolebinding tom-all-pod-reader clusterrolebinding.rbac.authorization.k8s.io "tom-all-pod-reader" deleted [root@master01 ~]# kubectl get rolebinding NAME ROLE AGE tom-pods-reader Role/pod-reader 27m tom-rolebinding-clusterrole ClusterRole/cluster-pods-reader 7m7s [root@master01 ~]# kubectl get pods -n kube-system --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "kube-system" [root@master01 ~]#
提示:能夠看到此時tom用戶就沒有對kube-system名稱空間下的pod有列出權限了;
驗證:使用tom用戶的配置文件,查看default名稱空間下的pods和service資源,看看是否有權限?
[root@master01 ~]# kubectl get pods --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 45h web-0 1/1 Running 2 2d22h web-1 1/1 Running 2 2d22h web-2 1/1 Running 2 2d22h web-3 1/1 Running 3 2d22h [root@master01 ~]# kubectl get svc --kubeconfig=/tmp/myk8s.config NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h nginx ClusterIP None <none> 80/TCP 3d [root@master01 ~]#
提示:能夠看到tom用戶在default名稱空間下可以正常列出pod和service資源;從上面的示例能夠看到當rolebinding綁定的是一個clusterrole,對應clusterrole的權限就會下降至對應rolebinding的名稱空間;
使用資源清單建立角色
示例:使用資源清單建立role-demo角色
[root@master01 ~]# cat role-demo.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: role-demo namespace: testing rules: - apiGroups: [""] resources: ["pods","pods/log","services"] verbs: ["get","list","watch"] [root@master01 ~]#
提示:role資源沒有spec字段,它的羣組是rbac.authorization.k8s.io/v1,對應類型爲Role;metadata字段中的name用於指定對應role的名稱;namespace用戶指定對應的名稱空間;roles字段用來描述對資源和權限,該字段爲一個列表對象,一個對象必須有apiGroup,resources和verbs字段;其中apiGroup字段用來描述對應資源所屬羣組,默認不寫任何羣組表示核心羣組v1;若是是匹配全部羣組能夠寫成「*」;該字段是一個列表類型數據,因此必須用中括號將其括起來,即使沒有值;resources字段用來描述對應的資源,這裏的資源若是可使用複數形式的必須使用複數形式;所謂複數是指對應資源名稱單詞的複數形式;該字段也是一個列表,可使用中括號,也能夠直接使用-開頭寫對應的值;verbs字段用來描述對應的權限,該字段也是一個列表,可使用中括號或者「-」開頭從下一行直接寫值的方式;上述資源清單表示建立一個名爲role-demo的角色在testing名稱空間;對應角色擁有對該名稱空間下的pod,pods/log和services資源有get,list,watch權限;
建立名稱空間並應用配置清單
[root@master01 ~]# kubectl get ns NAME STATUS AGE default Active 23d ingress-nginx Active 9d kube-node-lease Active 23d kube-public Active 23d kube-system Active 23d [root@master01 ~]# kubectl create ns testing namespace/testing created [root@master01 ~]# kubectl apply -f role-demo.yaml role.rbac.authorization.k8s.io/role-demo created [root@master01 ~]# kubectl get role -n testing NAME CREATED AT role-demo 2020-12-31T12:46:53Z [root@master01 ~]# kubectl describe role role-demo -n testing Name: role-demo Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods/log [] [] [get list watch] pods [] [] [get list watch] services [] [] [get list watch] [root@master01 ~]#
示例:使用資源清單建立rolebinding
[root@master01 ~]# cat rolebinding-demo.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: rolebinding-demo namespace: testing roleRef: kind: Role name: role-demo apiGroup: rbac.authorization.k8s.io subjects: - kind: User apiGroup: rbac.authorization.k8s.io name: tom [root@master01 ~]#
提示:使用資源清單建立rolebinding,須要用roleRef字段來指定引用的role或clusterrole,該字段爲一個對象,其中kind指定對應角色的類型,Role表示引用名稱空間級別的role;ClusterRole表示引用集羣級別角色clusterrole;apiGroup是用來描述對應角色的不帶版本api羣組;subjects字段用來描述對應用戶或組,該字段爲一個列表對象;其中kind字段用來表示對應的是用戶仍是用戶組;User表示用戶,Group表示用戶組;ServiceAccount表示是一個sa用戶;apiGroup用來指定對應不帶版本的api羣組;name用來指定用戶名或組名或sa名;上述資源清單表示把tom用戶和role-demo角色作關聯,即受權tom用戶擁有role-demo角色的權限;
驗證:在未應用資源清單前使用tom用戶的配置文件查看testing名稱空間下的pod資源
[root@master01 ~]# kubectl get pods -n testing --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "testing" [root@master01 ~]#
提示:在未應用上述資源清單,tom用戶對testing名稱空間的資源沒有任何權限;
應用資源清單
[root@master01 ~]# kubectl apply -f rolebinding-demo.yaml rolebinding.rbac.authorization.k8s.io/rolebinding-demo created [root@master01 ~]# kubectl get rolebinding -n testing NAME ROLE AGE rolebinding-demo Role/role-demo 31s [root@master01 ~]# kubectl describe rolebinding rolebinding-demo -n testing Name: rolebinding-demo Labels: <none> Annotations: <none> Role: Kind: Role Name: role-demo Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]# kubectl get pods -n testing --kubeconfig=/tmp/myk8s.config No resources found in testing namespace. [root@master01 ~]#
提示:能夠看到應用資源清單之後,再次使用tom用戶的配置文件查看testing名稱空間下的pod資源,就沒有提示沒有權限拒絕,只是告訴咱們對應名稱空間下沒有pod資源;
示例:使用資源清單建立clusterrole
[root@master01 ~]# cat clusterrole-demo.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: clusterrole-demo rules: - apiGroups: [""] resources: ["pods","nodes","PersistentVolume"] verbs: ["get","list","watch","create","delete"] [root@master01 ~]#
提示:使用資源清單建立clusterrole和建立role是同樣的格式,不一樣的是對應kind的值不一樣,不須要指定名稱空間;其餘的都同樣;
應用資源清單
[root@master01 ~]# kubectl apply -f clusterrole-demo.yaml clusterrole.rbac.authorization.k8s.io/clusterrole-demo created [root@master01 ~]# kubectl get clusterrole clusterrole-demo NAME CREATED AT clusterrole-demo 2020-12-31T13:23:48Z [root@master01 ~]# kubectl describe clusterrole clusterrole-demo Name: clusterrole-demo Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- PersistentVolume [] [] [get list watch create delete] nodes [] [] [get list watch create delete] pods [] [] [get list watch create delete] [root@master01 ~]#
示例:使用資源清單建立clusterrolebinding
[root@master01 ~]# cat clusterrolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: clusterrolebinding-demo roleRef: kind: ClusterRole name: clusterrole-demo apiGroup: rbac.authorization.k8s.io subjects: - kind: User apiGroup: rbac.authorization.k8s.io name: tom [root@master01 ~]#
提示:使用資源清單建立clusterrolebinding和建立rolebinding的格式同樣,不一樣的是建立clusterrolebinding不須要指定名稱空間,對應kind值爲ClusterRoleBinding;其餘字段的使用方式和role同樣;上述資源清單表示把tom用戶和clusterrole-demo角色作關聯;
驗證:在沒有應用資源清單前使用tom用戶的配置文件查看kube-system名稱空間下的pod資源
[root@master01 ~]# kubectl get pods -n kube-system --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "kube-system" [root@master01 ~]#
提示:沒有應用資源清單前使用tom用戶的配置文件查看kube-system名稱空間下的pod資源,是被apiserver拒絕的;
應用配置清單
[root@master01 ~]# kubectl apply -f clusterrolebinding.yaml clusterrolebinding.rbac.authorization.k8s.io/clusterrolebinding-demo created [root@master01 ~]# kubectl get clusterrolebinding clusterrolebinding-demo NAME ROLE AGE clusterrolebinding-demo ClusterRole/clusterrole-demo 15s [root@master01 ~]# kubectl describe clusterrolebinding clusterrolebinding-demo Name: clusterrolebinding-demo Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: clusterrole-demo Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]# kubectl get pods -n kube-system --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE coredns-7f89b7bc75-k9gdt 1/1 Running 18 23d coredns-7f89b7bc75-kp855 1/1 Running 16 23d etcd-master01.k8s.org 1/1 Running 22 23d kube-apiserver-master01.k8s.org 1/1 Running 17 23d kube-controller-manager-master01.k8s.org 1/1 Running 19 23d kube-flannel-ds-cx8d5 1/1 Running 20 23d kube-flannel-ds-jz6r4 1/1 Running 11 13d kube-flannel-ds-ndzl6 1/1 Running 21 23d kube-flannel-ds-rjtn9 1/1 Running 23 23d kube-flannel-ds-zgq92 1/1 Running 20 23d kube-proxy-cr8j8 1/1 Running 13 11d kube-proxy-h8fzw 1/1 Running 8 11d kube-proxy-jfzfh 1/1 Running 9 11d kube-proxy-rq8wl 1/1 Running 8 11d kube-proxy-sj72v 1/1 Running 8 11d kube-scheduler-master01.k8s.org 1/1 Running 19 23d [root@master01 ~]#
提示:能夠看到應用資源清單之後,再使用tom用戶的配置文件查看kube-system名稱空間下的pod就能夠正常列出了,說明對應tom用戶受權成功;
查看系統默認的clusterrole
[root@master01 ~]# kubectl get clusterrole NAME CREATED AT admin 2020-12-08T06:39:13Z cluster-admin 2020-12-08T06:39:13Z cluster-pods-reader 2020-12-31T11:35:03Z clusterrole-demo 2020-12-31T13:23:48Z edit 2020-12-08T06:39:13Z flannel 2020-12-08T06:59:56Z kubeadm:get-nodes 2020-12-08T06:39:15Z nginx-ingress-clusterrole 2020-12-21T15:16:13Z system:aggregate-to-admin 2020-12-08T06:39:13Z system:aggregate-to-edit 2020-12-08T06:39:13Z system:aggregate-to-view 2020-12-08T06:39:13Z system:auth-delegator 2020-12-08T06:39:13Z system:basic-user 2020-12-08T06:39:13Z system:certificates.k8s.io:certificatesigningrequests:nodeclient 2020-12-08T06:39:13Z system:certificates.k8s.io:certificatesigningrequests:selfnodeclient 2020-12-08T06:39:13Z system:certificates.k8s.io:kube-apiserver-client-approver 2020-12-08T06:39:13Z system:certificates.k8s.io:kube-apiserver-client-kubelet-approver 2020-12-08T06:39:13Z system:certificates.k8s.io:kubelet-serving-approver 2020-12-08T06:39:13Z system:certificates.k8s.io:legacy-unknown-approver 2020-12-08T06:39:13Z system:controller:attachdetach-controller 2020-12-08T06:39:13Z system:controller:certificate-controller 2020-12-08T06:39:13Z system:controller:clusterrole-aggregation-controller 2020-12-08T06:39:13Z system:controller:cronjob-controller 2020-12-08T06:39:13Z system:controller:daemon-set-controller 2020-12-08T06:39:13Z system:controller:deployment-controller 2020-12-08T06:39:13Z system:controller:disruption-controller 2020-12-08T06:39:13Z system:controller:endpoint-controller 2020-12-08T06:39:13Z system:controller:endpointslice-controller 2020-12-08T06:39:13Z system:controller:endpointslicemirroring-controller 2020-12-08T06:39:13Z system:controller:expand-controller 2020-12-08T06:39:13Z system:controller:generic-garbage-collector 2020-12-08T06:39:13Z system:controller:horizontal-pod-autoscaler 2020-12-08T06:39:13Z system:controller:job-controller 2020-12-08T06:39:13Z system:controller:namespace-controller 2020-12-08T06:39:13Z system:controller:node-controller 2020-12-08T06:39:13Z system:controller:persistent-volume-binder 2020-12-08T06:39:13Z system:controller:pod-garbage-collector 2020-12-08T06:39:13Z system:controller:pv-protection-controller 2020-12-08T06:39:13Z system:controller:pvc-protection-controller 2020-12-08T06:39:13Z system:controller:replicaset-controller 2020-12-08T06:39:13Z system:controller:replication-controller 2020-12-08T06:39:13Z system:controller:resourcequota-controller 2020-12-08T06:39:13Z system:controller:root-ca-cert-publisher 2020-12-08T06:39:13Z system:controller:route-controller 2020-12-08T06:39:13Z system:controller:service-account-controller 2020-12-08T06:39:13Z system:controller:service-controller 2020-12-08T06:39:13Z system:controller:statefulset-controller 2020-12-08T06:39:13Z system:controller:ttl-controller 2020-12-08T06:39:13Z system:coredns 2020-12-08T06:39:15Z system:discovery 2020-12-08T06:39:13Z system:heapster 2020-12-08T06:39:13Z system:kube-aggregator 2020-12-08T06:39:13Z system:kube-controller-manager 2020-12-08T06:39:13Z system:kube-dns 2020-12-08T06:39:13Z system:kube-scheduler 2020-12-08T06:39:13Z system:kubelet-api-admin 2020-12-08T06:39:13Z system:monitoring 2020-12-08T06:39:13Z system:node 2020-12-08T06:39:13Z system:node-bootstrapper 2020-12-08T06:39:13Z system:node-problem-detector 2020-12-08T06:39:13Z system:node-proxier 2020-12-08T06:39:13Z system:persistent-volume-provisioner 2020-12-08T06:39:13Z system:public-info-viewer 2020-12-08T06:39:13Z system:service-account-issuer-discovery 2020-12-08T06:39:13Z system:volume-scheduler 2020-12-08T06:39:13Z view 2020-12-08T06:39:13Z [root@master01 ~]#
提示:以system開頭的都是系統默認建立的clusterrole角色;這些角色都是用來給對應組件受權用的,好比,system:kube-dns就是用來給kube-dns這個pod在apiserver上驗證受權須要使用的角色;system:kube-controller-manager這個角色就是用來kube-controller-manager這個pod在apiserver上擁有的權限;kube-controller-manager這個pod向apiserver驗證時,首先把對應的證書發送給apiserver,apiserver經過識別對應證書中CN的名字來肯定對應的用戶名;若是對應用戶名是system:kube-controller-manager,那麼對應kube-controller-manager這個pod就擁有對應該角色的全部權限;若是咱們手動部署的k8s集羣,對應controller-manager的證書中CN名稱不是system:kube-controller-manager,那麼咱們手動部署的k8s集羣將不能正常工做,對於其餘組件也是相似的邏輯;除了內置了以system開頭的不少clusterrole,k8s爲了方便咱們受權,它還內置了4個特殊的clusterrole,分別是cluster-admin,admin,edit和view;其中cluster-admin是擁有對整個集羣的全部資源擁有全部權限,默認這個角色被clusterrolebinding綁定在system:master這個組上;對應kuberctl使用的證書文件中O的信息就是system:master,因此咱們使用kubectl加載默認的配置文件能夠操做整個集羣上的全部資源;admin角色也是一個管理員權限,不一樣於cluster-admin,admin角色通常用於經過rolebinding來實現對特有名稱空間的管理員受權;edit和view也是相似的邏輯,主要用於經過rolebinding來實現特有名稱空間下的特定管理員;好比快速受權某個用戶在某個名稱空間下擁有隻讀權限,那麼咱們就能夠把對應用戶經過rolebinding將其綁定至view這個clusterrole角色上;若是隻容許某個用戶擁有對應名稱空間下的全部資源的修改權限,就能夠把對應用戶經過rolebinding綁定到edit這個clusterrole角色上;固然以上幾個角色也能夠經過clusterrolebinding來綁定,用clusterrolebinding來綁定,對應用戶就是對應整個集羣的全部資源;有了上述4個內置的clusterrole,咱們就能夠快速的將某個用戶受權爲特定的角色:
查看kubectl默認證書中的信息
複製配置文件中的client-certificate-data 對應的被base64編碼處理過的信息,而後經過base64 -d將其解密,而後使用openssl x509 -text -noout 來查看對應證書中的信息
提示:能夠看到當前kubectl的證書中O=system:master CN=kubernetes-admin;之因此kubectl可以管理集羣資源是由於對應證書中的O=system:master,該信息直接對應k8s上的集羣角色cluster-admin;對應集羣角色就是經過clusterrolebinding綁定到system:master組;因此kubectl就擁有對k8s整個集羣資源的管控;
示例:受權tom用戶爲集羣管理員
[root@master01 ~]# cat tom-clusterrolebinding-cluster-admin.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tom-cluster-admin roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: User apiGroup: rbac.authorization.k8s.io name: tom [root@master01 ~]#
提示:上述資源表示經過clusterrolebinding受權tom用戶擁有cluster-admin角色的全部權限,即集羣管理員;
應用資源清單
[root@master01 ~]# kubectl apply -f tom-clusterrolebinding-cluster-admin.yaml clusterrolebinding.rbac.authorization.k8s.io/tom-cluster-admin created [root@master01 ~]# kubectl get clusterrolebinding tom-cluster-admin NAME ROLE AGE tom-cluster-admin ClusterRole/cluster-admin 21s [root@master01 ~]# kubectl describe clusterrolebinding tom-cluster-admin Name: tom-cluster-admin Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: cluster-admin Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]#
驗證:使用tom用戶的配置文件,管理集羣資源
[root@master01 ~]# kubectl get all --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE pod/nginx-pod-demo 1/1 Running 1 47h pod/web-0 1/1 Running 2 3d pod/web-1 1/1 Running 2 3d pod/web-2 1/1 Running 2 3d pod/web-3 1/1 Running 3 3d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d3h service/nginx ClusterIP None <none> 80/TCP 3d3h NAME READY AGE statefulset.apps/web 4/4 3d3h [root@master01 ~]# kubectl delete all --all --kubeconfig=/tmp/myk8s.config pod "nginx-pod-demo" deleted pod "web-0" deleted pod "web-1" deleted pod "web-2" deleted pod "web-3" deleted service "kubernetes" deleted service "nginx" deleted statefulset.apps "web" deleted [root@master01 ~]# kubectl apply -f statefulset-demo.yaml --kubeconfig=/tmp/myk8s.config service/nginx created statefulset.apps/web created [root@master01 ~]# kubectl get all --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE pod/web-0 1/1 Running 0 9s pod/web-1 1/1 Running 0 6s pod/web-2 1/1 Running 0 4s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 85s service/nginx ClusterIP None <none> 80/TCP 9s NAME READY AGE statefulset.apps/web 3/3 9s [root@master01 ~]#
提示:能夠看到咱們使用tom用戶的配置文件和默認配置文件是同樣的效果,瞬間tom用戶就變成了集羣管理;
刪除tom-cluster-admin這個clusterrolebinding
[root@master01 ~]# kubectl delete -f tom-clusterrolebinding-cluster-admin.yaml clusterrolebinding.rbac.authorization.k8s.io "tom-cluster-admin" deleted [root@master01 ~]#
受權tom用戶只讀ingress-nginx名稱空間下的全部資源
[root@master01 ~]# cat tom-ingress-nginx-view.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: tom-ingress-nginx-view namespace: ingress-nginx roleRef: kind: ClusterRole name: view apiGroup: rbac.authorization.k8s.io subjects: - kind: User apiGroup: rbac.authorization.k8s.io name: tom [root@master01 ~]#
提示:上述配置表示經過ingress-nginx名稱 空間下的rolebinding把tom用戶綁定至view這個clusterrole上;即對應tom用戶對ingress-nginx名稱空間下的全部資源只有只讀權限;
應用資源配置清單
[root@master01 ~]# kubectl apply -f tom-ingress-nginx-view.yaml rolebinding.rbac.authorization.k8s.io/tom-ingress-nginx-view created [root@master01 ~]# kubectl get rolebinding -n ingress-nginx NAME ROLE AGE nginx-ingress-role-nisa-binding Role/nginx-ingress-role 9d tom-ingress-nginx-view ClusterRole/view 22s [root@master01 ~]# kubectl describe rolebinding tom-ingress-nginx-view -n ingress-nginx Name: tom-ingress-nginx-view Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: view Subjects: Kind Name Namespace ---- ---- --------- User tom [root@master01 ~]#
驗證:使用tom用戶的配置文件管理ingress-nginx名稱空間下的資源
[root@master01 ~]# kubectl get pods -n ingress-nginx --kubeconfig=/tmp/myk8s.config NAME READY STATUS RESTARTS AGE nginx-ingress-controller-5466cb8999-dzn5d 1/1 Running 0 33s [root@master01 ~]# kubectl get pods --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "default" [root@master01 ~]# kubectl delete pod nginx-ingress-controller-5466cb8999-dzn5d -n ingress-nginx --kubeconfig=/tmp/myk8s.config Error from server (Forbidden): pods "nginx-ingress-controller-5466cb8999-dzn5d" is forbidden: User "tom" cannot delete resource "pods" in API group "" in the namespace "ingress-nginx" [root@master01 ~]#
提示:能夠看到如今tom用戶只能查看ingress-nginx名稱空間下的資源,不能查看default名稱空間下的資源,其次對ingress-nginx名稱空間下的pod資源沒有刪除權限;