溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

k8s集群中的rbac權(quán)限管理

發(fā)布時(shí)間:2020-07-02 04:24:31 來源:網(wǎng)絡(luò) 閱讀:591 作者:dongyali521521 欄目:云計(jì)算

啟用RBAC,需要在 apiserver 中添加參數(shù)--authorization-mode=RBAC,如果使用的kubeadm安裝的集群,1.6 版本以上的都默認(rèn)開啟了RBAC
查看是否開啟:
$ cat /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.1.243
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC

Kubernetes有一個(gè)很基本的特性就是它的所有資源對(duì)象都允許執(zhí)行 CRUD(Create、Read、Update、Delete)操作(也就是我們常說的增、刪、改、查操作)
和rbac相關(guān)的資源對(duì)象包括:
1、Rule:規(guī)則,規(guī)則是一組屬于不同 API Group 資源上的一組操作的集合
2、Role 和 ClusterRole:角色和集群角色,這兩個(gè)對(duì)象都包含上面的 Rules 元素,二者的區(qū)別在于,在 Role 中,定義的規(guī)則只適用于單個(gè)命名空間,也就是和 namespace 關(guān)聯(lián)的,而 ClusterRole 是集群范圍內(nèi)的,因此定義的規(guī)則不受命名空間的約束。
3、Subject:主題,對(duì)應(yīng)在集群中嘗試操作的對(duì)象,集群中定義了3種類型的主題資源:
User Account:這是有外部獨(dú)立服務(wù)進(jìn)行管理的,對(duì)于用戶的管理集群內(nèi)部沒有一個(gè)關(guān)聯(lián)的資源對(duì)象,所以用戶不能通過集群內(nèi)部的 API 來進(jìn)行管理
Group:這是用來關(guān)聯(lián)多個(gè)賬戶的,集群中有一些默認(rèn)創(chuàng)建的組,比如cluster-admin
Service Account:通過Kubernetes API 來管理的一些用戶帳號(hào),和 namespace 進(jìn)行關(guān)聯(lián)的,適用于集群內(nèi)部運(yùn)行的應(yīng)用程序,需要通過 API 來完成權(quán)限認(rèn)證
4:RoleBinding 和 ClusterRoleBinding
簡(jiǎn)單來說就是把聲明的 Subject 和我們的 Role 進(jìn)行綁定的過程(給某個(gè)用戶綁定上操作的權(quán)限),二者的區(qū)別也是作用范圍的區(qū)別:RoleBinding 只會(huì)影響到當(dāng)前 namespace 下面的資源操作權(quán)限,而 ClusterRoleBinding 會(huì)影響到所有的 namespace。

創(chuàng)建一個(gè) User Account,只能訪問 kube-system 這個(gè)命名空間
1、創(chuàng)建私鑰
$ openssl genrsa -out dongyali.key 2048
2、創(chuàng)建證書簽名請(qǐng)求文件
CN表示要?jiǎng)?chuàng)建的用戶名,O表示要?jiǎng)?chuàng)建的組
penssl req -new -key dongyali.key -out dongyali.csr -subj "/CN=dongyali/O=booster"
3、生成最終的證書文件,設(shè)置證書的有效期為1000天
需要使用ca.crt和ca.key兩個(gè)文件來批準(zhǔn)證書請(qǐng)求,如果使用的是kubeadm安裝的集群,這個(gè)兩個(gè)文件位于/etc/kubernetes/pki/目錄下面
$ openssl x509 -req -in dongyali.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out dongyali.crt -days 1000
$ ls
dongyali.csr dongyali.key dongyali.crt
4、使用剛剛創(chuàng)建的證書文件和私鑰文件在集群中創(chuàng)建用戶dongyali
$ kubectl config set-credentials dongyali --client-certificate=dongyali.crt --client-key=dongyali.key
5、為用戶創(chuàng)建上下文,并限制在kube-system空間內(nèi)
$ kubectl config set-context dongyali-context --cluster=kubernetes --namespace=kube-system --user=dongyali
6、為用戶dongyali創(chuàng)建角色
創(chuàng)建一個(gè)允許用戶操作 Deployment、Pod、ReplicaSets 的角色

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dongyali-role
  namespace: kube-system
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["deployments", "replicasets", "pods"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]     # 也可以使用['*']

7、創(chuàng)建角色綁定,綁定用戶dongyali和角色

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dongyali-rolebinding
  namespace: kube-system
subjects:
- kind: User
  name: dongyali
  apiGroup: ""
roleRef:
  kind: Role
  name: dongyali-role
  apiGroup: ""

8、測(cè)試
$ kubectl get pods --context=dongyali-context
$ kubectl --context=dongyali-context get pods --namespace=default
Error from server (Forbidden): pods is forbidden: User "dongyali" cannot list pods in the namespace "default"

創(chuàng)建一個(gè)只能訪問某個(gè) namespace 的ServiceAccount
1、創(chuàng)建一個(gè) ServiceAccount 對(duì)象
$ kubectl create sa dongyali-sa -n kube-system
2、創(chuàng)建role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dongyali-sa-role
  namespace: kube-system
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

3、創(chuàng)建一個(gè) RoleBinding 對(duì)象

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dongyali-sa-rolebinding
  namespace: kube-system
subjects:
- kind: ServiceAccount
  name: dongyali-sa
  namespace: kube-system
roleRef:
  kind: Role
  name: dongyali-sa-role
  apiGroup: rbac.authorization.k8s.io

創(chuàng)建一個(gè)可以訪問所有 namespace 的ServiceAccount
需要使用 ClusterRole 和 ClusterRoleBinding 這兩種資源對(duì)象
1、新建一個(gè) ServiceAcount 對(duì)象

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dongyali-sa2
  namespace: kube-system

2、創(chuàng)建一個(gè) ClusterRoleBinding 對(duì)象
使用現(xiàn)有的集群角色cluster-admin,不用創(chuàng)建新的了

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dongyali-sa2-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: dongyali-sa2
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI