關於RBAC相關的知識點可以參考kubernetes官方文檔:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/#kubectl-create-rolebinding
1、用戶"wangqing"可以查看default、kube-system 兩個namespace下的pod以及pod日誌權限
2、用戶"xiaowang"可以在default這個namespace下pod執行命令,並且可以刪除pod
一、Serviceaccount服務賬戶和命名空間;
首先我們可以創建一個命名空間"kube-users",將兩個serviceaccount賬號同一管理;
#kubectl create ns kube-users
創建兩個serviceaccount兩個服務賬號,指定上述的kube-users的命名空間
#kubectl create sa wangaing -n kube-users
#kubectl create sa xiaowang -n kube-users
查看kube-users下創建的兩個serviceaccount服務賬號
# kubectl get sa -n kube-users
NAME SECRETS AGE
wangqing 1 77m
xiaowang 1 77m
創建serviceaccount兩個服務賬號的同時也會生成對應的secret,我們在登陸的時候可以查看secret-token進行登錄驗證
[root@k8s-master01 ~]#kubectl get secret -n kube-users
NAME TYPE DATA AGE
wangqing-token-v45sp kubernetes.io/service-account-token 3 76m
xiaowang-token-tzpgc kubernetes.io/service-account-token 3 75m
namespace以及serviceaccount創建完之後,默認是沒有任何權限的,接下來需要創建不同權限clusterrole和rolebinding將我們的sa(serviceaccount)賬戶與之綁定,即可實現不同用戶擁有對namspace不同的管理權限了
二、創建不同權限的clusterrole
2.1、創建查詢namespace下權限的clusterrole
#vim namespace-list.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: namespace-readonly
rules:
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- metrics.k8s.io
resources:
- pods
verbs:
- get
- list
- watch
#kubectl create -f namespace-list.yaml
2.2、將名爲"namespace-readonly"的clusterrole綁定全局命名空間“kube-users”下,那麼此時,“kube-users”下所有的serviceaccount賬戶都具有對全局的namespace查詢權限
#vim namespace-readonly.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: namespace-readonly-sa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: namespace-readonly. #指定名爲“namespace-readonly”的clusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:serviceaccounts:kube-users #針對該"kube-users"namespace下的serviceaccount進行授權,授權查詢全局namespace的權限
#kubectl create -f namespace-readonly.yaml
驗證clusterrolebinding綁定的之後的secretaccount賬戶,驗證一下kube-users下的sa是否對namespace僅是隻讀權限
2.3、創建一個具有查看pod權限的clusterrole
#vim pod-log.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-log
rules:
- apiGroups:
- ""
resources:
- pods
- pods/log
verbs:
- get
- list
- watch
#kubectl create -f pod-log.yaml
2.4、創建一個rolebinding.在kube-system和default兩個Namespace中,將具有查詢pod日誌權限的"pod-log"clusterrole授權給kube-users命名空間下的wangqing服務賬戶(ServiceAccount)
#kubectl create rolebinding wangqing-pod-log --clusterrole=pod-log --serviceaccount=kube-users:wangqing --namespace=kube-system
#kubectl create rolebinding wangqing-pod-log --clusterrole=pod-log --serviceaccount=kube-users:wangqing --namespace=default
通過wangqing這個sa賬戶登錄驗證除了能查看pod狀態的權限之外,其它權限(執行、刪除、更新)都沒有。如果執行未授權的操作將會報錯,如下圖所示:
2.5、創建一個擁有對pod執行、刪除權限的clusterrole
#vim pod-exec.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-exec
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- apiGroups:
- ""
resources:
- pods/exec
verbs:
- create
#vim pod-delete.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-delete
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- delete
#kubectl create -f pod-delete.yaml -f pod-exec.yaml
創建兩個Rolebinding:
在namespace "default"中,將一個名爲"pod-exec“ ClusterRole對象中的執行權限授予namespace中名稱爲“xiaowang”的服務賬戶(ServiceAccount):
#kubectl create rolebinding xiaowang-pod-exec --clusterrole=pod-exec --serviceaccount=kube-users:xiaowang --namespace=default
在namespace "default"中,將一個名爲"pod-delete“ ClusterRole對象中的執行權限授予namespace中名稱爲“xiaowang”的服務賬戶(ServiceAccount):
#kubectl create rolebinding xiaowang-pod-delete --clusterrole=pod-delete --serviceaccount=kube-users:xiaowang --namespace=default
驗證:通過xiaowang這個serviceaccount這個賬戶登錄到界面可以看到在default這個命名空間下可以對pod進行執行、刪除等操作
END!