前言
kubernetes應用越來越廣泛,我們kubernetes集群中也會根據業務來划分不同的命名空間,隨之而來的就是安全權限問題,我們不可能把集群管理員賬號分配給每一個人,有時候可能需要限制某用戶對某些特定命名空間的權限,比如開發和測試人員也可能需要登錄集群,了解應用的運行情況,查看pod的日志,甚至是修改某些配置。這時候,我們可以通過創建受限的kubeconfig文件,將該config分發給有需要的人員,讓他們能通過kubectl命令實現一些允許的操作。
創建集群級別的角色 ClusterRole
clusterrole.dev-log.yaml 用於提供對pod的完全權限和其它資源的查看權限.
# 提供基本權限
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: dev-log
rules:
- apiGroups:
- ""
resources:
- pods
- pods/exec
verbs:
- create
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods
verbs:
- delete
- apiGroups:
- ""
resources:
- endpoints
- services
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- bindings
- events
- limitranges
- namespaces/status
- pods/log
- pods/status
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- deployments
- deployments/rollback
- deployments/scale
- statefulsets
verbs:
- get
- list
- watch
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- get
- list
- watch
- apiGroups:
- batch
resources:
- cronjobs
- jobs
- scheduledjobs
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- ingresses
- replicasets
verbs:
- get
- list
- watch
在default命名空間應用配置文件:
$ kubectl apply -f clusterrole.dev-log.yaml -n default
$ kubectl get ClusterRole -n default
在default命名空間創建 ServiceAccount
創建ServiceAccount后,會自動創建一個綁定的 secret ,后面在kubeconfig文件中,會用到該secret中的token.
$ kubectl create serviceaccount dev -n default
$ kubectl get serviceaccount -n default
對ServiceAccount和集群角色建立綁定關系
對需要的namespace進行授權,以下示例為對app命名空間授權。
$ kubectl create rolebinding rbd-dev --clusterrole=dev-log --serviceaccount=default:dev --namespace=app
獲取ServiceAccount的secret中的token
$ kubectl get serviceaccounts dev -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2020-06-03T06:36:29Z"
name: dev
namespace: app
resourceVersion: "2633621"
selfLink:xxx
uid: xx
secrets:
- name: dev-token-v97rh
對應的secret名稱為:dev-token-v97rh。
$ kubectl get secrets dev-token-v97rh -o yaml
apiVersion: v1
data:
ca.crt: xxx
namespace: aGFkb29w
token: xxx
kind: Secret
metadata:
annotations:
kubernetes.io/service-account.name: dev
kubernetes.io/service-account.uid: xxx
creationTimestamp: "2020-06-03T06:36:29Z"
name: dev-token-v97rh
namespace: app
resourceVersion: "2633620"
selfLink: xxx
uid:xxx
type: kubernetes.io/service-account-token
該secret的token為:
token=xxx
該token是經過base64處理的,需要進行解碼處理
$ echo $token | base64 -d
xxx
組裝config文件
將token填充到以下的config配置中:
# config
apiVersion: v1
kind: Config
clusters:
- cluster:
server: K8S集群地址
certificate-authority-data: "ca.crt后的內容"
name: k8s-dev
users:
- name: "devlog"
user:
token: "解碼后的token字符串"
contexts:
- context:
cluster: dev
user: "dev"
name: dev
preferences: {}
current-context: dev
將該文件保存為config 並放入 $HOME/.kube/ 目錄下即可。
至此,k8s限制用戶在多個namespace上的訪問權限操作完成。
后記
K8S權限控制是很復雜的,本文只是最簡單的一種,因為工作需要,做個記錄。后面有其他的需求再做補充。