K8S創建用戶RBAC授權


Kubernetes操作賬號及權限設置

目前RBAC是k8s授權方式最常用的一種方式。在k8s上,一個客戶端向apiserver發起請求,需要如下信息:

1)username,uid,
2) group,
3) extra(額外信息)
4) API
5) request path,例如:http:``//127.0.0.1:8080/apis/apps/v1/namespaces/kube-system/d
6)HTTP request action,如get,post,put,``delete``,
7)Http request action,如 get,list,create,udate,patch,watch,proxy,redirect,``delete``,deletecollection
8) Rresource
9)Subresource
10)Namespace
11)API group

創建serviceaccount

# In GKE need to get RBAC permissions first with
# kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=<user-name>|--group=<group-name>]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace:jenkins

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: jenkins
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get","list","watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["watch"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: jenkins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: jenkins
subjects:
- kind: ServiceAccount
  name: jenkins

創建useraccount

一.生成賬號

例如:給K8S集群創建一個gpu用戶

在k8s的master節點上執行:

#創建證書
(umask 077; openssl genrsa -out gpu.key 2048) 
openssl req -new -key gpu.key -out gpu.csr -subj "/CN=gpu"
openssl x509 -req -in gpu.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out gpu.crt -days 3650
openssl x509 -in gpu.crt -text -noout

#把用戶賬戶信息添加到k8s集群中
kubectl config set-credentials gpu --client-certificate=./gpu.crt --client-key=./gpu.key --embed-certs=true

#創建賬戶,設置用戶訪問的集群
kubectl config set-context gpu@kubernetes --cluster=kubernetes --user=gpu
#切換用戶
kubectl config use-context gpu@kubernetes
#驗證權限
kubectl get pods
#切換成管理員
kubectl config use-context kubernetes-admin@kubernetes	

查看所有用戶
kubectl config get-contexts

查看集群角色
kubectl get ClusterRole

查看服務賬戶
kubectl get serviceAccount

二.設置權限

在管理員權限下創建角色和權限並綁定到用戶(role 和role-binding)

role.yaml

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: gpu
  name: gpu-reader
rules:
rules:
  - apiGroups: [""] # "" indicates the core API group
    resources: ["services"]
    verbs: ["get", "watch", "list"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
  - apiGroups: ["batch", "externsions"]
    resources: ["jobs"]
    verbs: ["get","list","watch","create", "update","patch","delete"]

role-binding.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods
  namespace: gpu
subjects:
- kind: User
  name: gpu
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: gpu-reader
  apiGroup: rbac.authorization.k8s.io

三.生成用戶config文件

輸出全部用戶配置

kubectl config view --raw --output='json' >1.json
vim 1.json
刪除users內除"name": "gpu"的其他內容
刪除contexts內除"name": "gpu@kubernetes"的其他內容

mv 1.json config //分發config給用戶

RBAC

一、基於角色的訪問控制

rbac:role based ac,也就是我們把用戶加入角色里面,這樣用戶就具有角色的權限了。

RBAC是通過rolebinding把user綁定到role上的。而role是基於namespace設定的,也就是這說這個user只能訪問指定namespace下的pod資源。

而如果把user通過ClusterRoleBind綁定到ClusterRole上后,那么這個user就突破了namespace的限制,而擁有了集群級別的權限,即這個用戶可以訪問這個集群下所有namespace下的pod了。

但是,我們也可以用RoleBinding去把user綁定到ClusteRrole。在下圖中,我們把user1通過rolebinding綁定到ClusteRrole上,但是我們知道rolebinding只限制在namespace中,所以user1也只限定在namespace中,而不是整個集群中。

二、CluserRoleBinding和RoleBinding的區別

CluserRoleBinding是針對集群的,而RoleBinding是只針對namespace的。

三、useraccountserviceaccount

k8s驗證分為useraccountserviceaccount

個人理解serviceaccount是指服務賬戶,是指在POD的啟動賬戶,serviceaccount設置的就是該POD啟動后的權限。比如linux服務器下httpd服務可以指定http賬戶啟動,但http賬戶本身沒有對系統的登錄權限。

useraccount就好比是linux服務器的登錄賬戶,是有登錄權限的。可以使用confi在客戶端連接K8S集群的賬戶。

附錄

一、使用create生成配置的yaml文件

kubectl create serviceaccount mysa -o yaml --dry-run > mysa.yaml

上面我們可以看到,只要是kubectl create的,只要加上-o yaml,就可以導出清單文件,這樣我們以后就不用從頭到尾寫清單文件了,而是只要生產一個,然后改改就行了,這個很不錯。

另外kubectl get 也可以導出yaml格式的,如下:

kubectl get pods myapp``-1` `-o yaml --export

二、創建jenkins的serviceaccount

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: jenkins
  name: service-reader
rules:
  - apiGroups: [""] # "" indicates the core API group
    resources: ["services"]
    verbs: ["get", "watch", "list"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
#在jenkins命名空間下創建一個服務賬號jenkins
#kubectl create serviceaccount jenkins -n jenkins -o yaml
kubectl create serviceaccount jenkins -n servers

#創建一個名為“service-reader-pod”的集群角色綁定,它的“clusterrole”是“service-reader”,它的名字是“default:default”,其中第一個“default”是名空間(namespace),第二個“default”是服務賬戶名字

kubectl create clusterrolebinding service-reader-pod --clusterrole=service-reader  --serviceaccount=servers:jenkins

參考文獻

http://blog.itpub.net/28916011/viewspace-2215100/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM