k8s集羣中的rbac權限管理

啓用RBAC,需要在 apiserver 中添加參數--authorization-mode=RBAC,如果使用的kubeadm安裝的集羣,1.6 版本以上的都默認開啓了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有一個很基本的特性就是它的所有資源對象都允許執行 CRUD(Create、Read、Update、Delete)操作(也就是我們常說的增、刪、改、查操作)
和rbac相關的資源對象包括:
1、Rule:規則,規則是一組屬於不同 API Group 資源上的一組操作的集合
2、Role 和 ClusterRole:角色和集羣角色,這兩個對象都包含上面的 Rules 元素,二者的區別在於,在 Role 中,定義的規則只適用於單個命名空間,也就是和 namespace 關聯的,而 ClusterRole 是集羣範圍內的,因此定義的規則不受命名空間的約束。
3、Subject:主題,對應在集羣中嘗試操作的對象,集羣中定義了3種類型的主題資源:
User Account:這是有外部獨立服務進行管理的,對於用戶的管理集羣內部沒有一個關聯的資源對象,所以用戶不能通過集羣內部的 API 來進行管理
Group:這是用來關聯多個賬戶的,集羣中有一些默認創建的組,比如cluster-admin
Service Account:通過Kubernetes API 來管理的一些用戶帳號,和 namespace 進行關聯的,適用於集羣內部運行的應用程序,需要通過 API 來完成權限認證
4:RoleBinding 和 ClusterRoleBinding
簡單來說就是把聲明的 Subject 和我們的 Role 進行綁定的過程(給某個用戶綁定上操作的權限),二者的區別也是作用範圍的區別:RoleBinding 只會影響到當前 namespace 下面的資源操作權限,而 ClusterRoleBinding 會影響到所有的 namespace。

創建一個 User Account,只能訪問 kube-system 這個命名空間
1、創建私鑰
$ openssl genrsa -out dongyali.key 2048
2、創建證書籤名請求文件
CN表示要創建的用戶名,O表示要創建的組
penssl req -new -key dongyali.key -out dongyali.csr -subj "/CN=dongyali/O=booster"
3、生成最終的證書文件,設置證書的有效期爲1000天
需要使用ca.crt和ca.key兩個文件來批准證書請求,如果使用的是kubeadm安裝的集羣,這個兩個文件位於/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、使用剛剛創建的證書文件和私鑰文件在集羣中創建用戶dongyali
$ kubectl config set-credentials dongyali --client-certificate=dongyali.crt --client-key=dongyali.key
5、爲用戶創建上下文,並限制在kube-system空間內
$ kubectl config set-context dongyali-context --cluster=kubernetes --namespace=kube-system --user=dongyali
6、爲用戶dongyali創建角色
創建一個允許用戶操作 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、創建角色綁定,綁定用戶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、測試
$ 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"

創建一個只能訪問某個 namespace 的ServiceAccount
1、創建一個 ServiceAccount 對象
$ kubectl create sa dongyali-sa -n kube-system
2、創建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、創建一個 RoleBinding 對象

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

創建一個可以訪問所有 namespace 的ServiceAccount
需要使用 ClusterRole 和 ClusterRoleBinding 這兩種資源對象
1、新建一個 ServiceAcount 對象

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

2、創建一個 ClusterRoleBinding 對象
使用現有的集羣角色cluster-admin,不用創建新的了

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章