您好,登錄后才能下訂單哦!
本文的kubernetes環境:https://blog.51cto.com/billy98/2350660
RBAC官方文檔:https://kubernetes.io/docs/reference/access-authn-authz/rbac/
rbac.authorization.k8s.io
API Group 來實現授權決策,允許管理員通過 Kubernetes API 動態配置策略,要啟用RBAC,需要在 apiserver 中添加參數--authorization-mode=RBAC,如果使用的kubeadm安裝的集群,都默認開啟了RBAC,可以通過查看 Master 節點上 apiserver 的靜態Pod定義文件:
[root@node-01 ~]# cat /etc/kubernetes/manifests/kube-apiserver.yaml
···
- --authorization-mode=Node,RBAC
···
Kubernetes有一個很基本的特性就是它的所有資源對象都是模型化的 API 對象,允許執行增、刪、改、查等操作,比如下面的這下資源:
上面這些資源對象的可能存在的操作有:
Kubernetes 并不會存儲由認證插件從客戶端請求中提取出的用戶及所屬組的信息,它們僅僅用于檢驗用戶是否有權限執行其所請求的操作。
客戶端訪問API服務的途徑通常有三種:kubectl、客戶端庫或者直接使用 REST接口進行請求。
而可以執行此類請求的主體也被 Kubernetes 分為兩類:現實中的“人”和 Pod 對象, 它們的用戶身份分別對應于常規用戶 (User Account )和服務賬號 ( Service Account) 。
Kubernetes 有著以下幾個內建的用于特殊目的的組 。
RoleBinding用于將Role上的許可權限綁定到一個或一組用戶之上,它隸屬于且僅能作用于一個命名空間。綁定時,可以引用同一名稱中的Role,也可以引用集群級別的 ClusterRole。
Role、RoleBinding、ClusterRole和ClusterRoleBinding 的關系如圖 所示 。
下面我們來創建一個User Account,測試訪問某些我們授權的資源:
創建user私鑰
[root@node-01 ~]# cd /etc/kubernetes/pki/
[root@node-01 pki]# (umask 077;openssl genrsa -out billy.key 2048)
Generating RSA private key, 2048 bit long modulus
.................................................................................+++
..................+++
e is 65537 (0x10001)
創建證書簽署請求
O=組織信息,CN=用戶名
[root@node-01 pki]# openssl req -new -key billy.key -out billy.csr -subj "/O=jbt/CN=billy"
[root@node-01 pki]# openssl x509 -req -in billy.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out billy.crt -days 365
Signature ok
subject=/O=jbt/CN=billy
Getting CA Private Key
創建配置文件主要有以下幾個步驟:
kubectl config set-cluster --kubeconfig=/PATH/TO/SOMEFILE #集群配置
kubectl config set-credentials NAME --kubeconfig=/PATH/TO/SOMEFILE #用戶配置
kubectl config set-context #context配置
kubectl config use-context #切換context
- --embed-certs=true的作用是不在配置文件中顯示證書信息。
- --kubeconfig=/root/billy.conf用于創建新的配置文件,如果不加此選項,則內容會添加到家目錄下.kube/config文件中,可以使用use-context來切換不同的用戶管理k8s集群。
- context簡單的理解就是用什么用戶來管理哪個集群,即用戶和集群的結合。
創建集群配置
[root@node-01 pki]# kubectl config set-cluster k8s --server=https://10.31.90.200:8443 --certificate-authority=ca.crt --embed-certs=true --kubeconfig=/root/billy.conf
Cluster "k8s" set.
[root@node-01 pki]# kubectl config view --kubeconfig=/root/billy.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.31.90.200:8443
name: k8s
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []
創建用戶配置
[root@node-01 pki]# kubectl config set-credentials billy --client-certificate=billy.crt --client-key=billy.key --embed-certs=true --kubeconfig=/root/billy.conf
User "billy" set.
#查看配置文件
[root@node-01 pki]# kubectl config view --kubeconfig=/root/billy.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.31.90.200:8443
name: k8s
contexts: []
current-context: ""
kind: Config
preferences: {}
users:
- name: billy
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
創建context配置
[root@node-01 pki]# kubectl config set-context billy@k8s --cluster=k8s --user=billy --kubeconfig=/root/billy.conf
Context "billy@k8s" created.
#查看配置文件
[root@node-01 pki]# kubectl config view --kubeconfig=/root/billy.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.31.90.200:8443
name: k8s
contexts:
- context:
cluster: k8s
user: billy
name: billy@k8s
current-context: ""
kind: Config
preferences: {}
users:
- name: billy
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
切換context
[root@node-01 pki]# kubectl config use-context billy@k8s --kubeconfig=/root/billy.conf
Switched to context "billy@k8s".
#查看配置文件
[root@node-01 pki]# kubectl config view --kubeconfig=/root/billy.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.31.90.200:8443
name: k8s
contexts:
- context:
cluster: k8s
user: billy
name: billy@k8s
current-context: billy@k8s
kind: Config
preferences: {}
users:
- name: billy
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
創建系統用戶及k8s驗證文件
[root@node-01 ~]# useradd billy #創建什么用戶名都可以
[root@node-01 ~]# mkdir /home/billy/.kube
[root@node-01 ~]# cp billy.conf /home/billy/.kube/config
[root@node-01 ~]# chown billy.billy -R /home/billy/.kube/
[root@node-01 ~]# su - billy
[billy@node-01 ~]$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "billy" cannot list resource "pods" in API group "" in the namespace "default"
#默認新用戶是沒有任何權限的。
此role只有pod的get、list、watch權限
[root@node-01 rbac]# cat pods-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pods-reader
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
[root@node-01 rbac]# kubectl apply -f pods-reader.yaml
role.rbac.authorization.k8s.io/pods-reader created
用戶billy和role pods-reader的綁定
[root@node-01 rbac]# cat billy-pods-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: billy-pods-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pods-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: billy
[root@node-01 rbac]# kubectl apply -f billy-pods-reader.yaml
rolebinding.rbac.authorization.k8s.io/billy-pods-reader created
如果沒有指定命名空間的話,默認就是default命名空間。
[billy@node-01 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-demo-95bd675d5-66xrm 1/1 Running 0 18d
tomcat-5c5dcbc885-7vr68 1/1 Running 0 18d
[billy@node-01 ~]$ kubectl -n kube-system get pod
Error from server (Forbidden): pods is forbidden: User "billy" cannot list resource "pods" in API group "" in the namespace "kube-system"
所以我們是可以查看查看default命名空間的pod,但是其他空間的pod是無法查看的。
[root@node-01 rbac]# cat cluster-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-reader
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
[root@node-01 rbac]# kubectl apply -f cluster-reader.yaml
clusterrole.rbac.authorization.k8s.io/cluster-reader created
[root@node-01 rbac]# cat billy-read-all-pods.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: billy-read-all-pods
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: billy
[root@node-01 rbac]# kubectl apply -f billy-read-all-pods.yaml
clusterrolebinding.rbac.authorization.k8s.io/billy-read-all-pods created
創建了ClusterRole和ClusterRoleBinding后就可以看到所有命名空間的pod了。
[billy@node-01 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-demo-95bd675d5-66xrm 1/1 Running 0 18d
tomcat-5c5dcbc885-7vr68 1/1 Running 0 18d
[billy@node-01 ~]$ kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
canal-gd4qn 2/2 Running 0 21d
cert-manager-6464494858-wqpnb 1/1 Running 0 18d
coredns-7f65654f74-89x69 1/1 Running 0 18d
coredns-7f65654f74-bznrl 1/1 Running 2 54d
...
至于ServiceAccount怎么授權,其實相對user account來說更簡單,只需先創建ServiceAccount,然后創建role或者ClusterRole,最后在RoleBinding或ClusterRoleBinding綁定即可。以下簡單做一個示例,就不在顯示結果了,大家可以自己去驗證。
kubectl create sa billy-sa
[root@node-01 rbac]# cat billy-sa-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: billy-sa-role
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
將billy-sa和billy-sa-role的綁定
[root@node-01 rbac]# cat billy-sa-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: billy-sa-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: billy-sa-role
subjects:
- kind: ServiceAccount
name: billy-sa
創建完SA之后系統會自動創建一個secret,我們可以獲取這個secret里面的token去登錄dashboard,就可以看到相應有權限的資源。
kubectl get secret billy-sa-token-9rc55 -o jsonpath={.data.token} |base64 -d
還可以在創建pod時在pod的spec里指定serviceAccountName,那么這個pod就擁有了對應的權限,具體的就不在演示了。
本次的分享就到此,如有問題歡迎在下面留言交流,希望大家多多關注和點贊,謝謝!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。