需求:我們知道搭完k8s集群會創建一個默認的管理員kubernetes-admin用戶該用戶擁有所以權限,有一天開發或測試的同學需要登錄到k8s集群了解業務pod的狀態等,我們不可能提供管理員的賬戶給他不安全如果他因為某個高管。。。刪庫跑路啥辦??,所以建一個只讀賬戶迫在眉睫。
kubectl conifg命令常見操作:
- kubectl config view:打印kubeconfig⽂件內容。
- kubectl config set-cluster:設置kubeconfig的clusters配置段。
- kubectl config set-credentials:設置kubeconfig的users配置段。
- kubectl config set-context:設置kubeconfig的contexts配置段。
- kubectl config use-context:設置kubeconfig的current-context配置段。
# kubectl config view

一、我是用kubeadm部署的集群,給只讀賬戶jackhe創建私鑰及證書文件,並保存在/etc/kubernetes/pki目錄下。
1)生成私鑰文件。
cd /etc/kubernetes/pki/ umask 077;openssl genrsa -out jackhe.key 2048

2)創建證書部署請求,關鍵點其中-subj選項中的CN的值將被kubeconfig最為用戶名使用。
openssl req -new -key jackhe.key -out jackhe.csr -subj "/CN=jackhe"
3)用kubernetes集群生成的CA簽署證書,設置有限時間3650天。
openssl x509 -req -in jackhe.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out jackhe.crt -days 3650

4)驗證證書信息。
openssl x509 -in jackhe.crt -text -noout

二、創建一個新的集群信息,因為最終我們是提供config給使用者,默認的config文件有管理員信息當我們執行:kubectl config use-context kubernetes-admin@kubernetes就擁有了管理權限,這是不被允許的。
kubectl config set-cluster mycluster --kubeconfig=/tmp/config --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server="https://192.168.10.129:6443"
選項:
--kubeconfig="":配置文件存放路徑 --certificate-authority="": 設置kuebconfig配置文件中集群選項中的certificate-authority路徑。 --embed-certs=false: 設置kuebconfig配置文件中集群選項中的embed-certs開關。 --server="": 設置kuebconfig配置文件中集群選項中的server。
三、配置客戶端證書及密鑰,⽤戶名信息會通過命令從證書Subject的CN值中⾃動提取,例如前⾯創建csr時使⽤的“CN=jackhe”.
kubectl config set-credentials jackhe --embed-certs=true --client-certificate=/etc/kubernetes/pki/jackhe.crt --client-key=/etc/kubernetes/pki/jackhe.key --kubeconfig=/tmp/config
選項:
--client-certificate="": 設置kuebconfig配置文件中用戶選項中的證書文件路徑。 --client-key="": 設置kuebconfig配置文件中用戶選項中的證書密鑰路徑。 --embed-certs=false: 設置kuebconfig配置文件中用戶選項中的embed-certs開關。
四、配置context,⽤來組合cluster和credentials,即訪問的集群的上下⽂。
kubectl config set-context jackhe@mycluster --cluster=mycluster --user=jackhe --kubeconfig=/tmp/config
注意: jackhe@mycluster要對應上你新建的集群名字!!!
五、指定上下文切換到jackhe訪問集群,我們能看到現在是沒有任何權限的。
kubectl config use-context jackhe@mycluster --kubeconfig=/tmp/config kubectl config view --kubeconfig=/tmp/config kubectl get pod --kubeconfig=/tmp/config

六、接下來我們基於RBAC建立只讀ClusterRole文件(權限可配置)。
kubectl apply -f readonly.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: cluster-readonly rules: - apiGroups: - "" resources: - pods - pods/attach - pods/exec - pods/portforward - pods/proxy verbs: - get - list - watch - apiGroups: - "" resources: - configmaps - endpoints - persistentvolumeclaims - replicationcontrollers - replicationcontrollers/scale - secrets - serviceaccounts - services - services/proxy 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
七、創建基於用戶jackhe的ClusterRoleBinding文件。
kubectl apply -f readonly.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: cluster-readonly roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-readonly subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: jackhe
八、我們這時再測試已經有了只讀權限。
kubectl get pod --kubeconfig=/tmp/config

九、大功告成,接下來我們只要把/tmp/config文件放到用戶的家目錄.kube下就可以使用了。
mkdir -p /home/jackhe/.kube cp /tmp/config /home/jackhe/.kube/ chown -R jackhe.jackhe /home/jackhe/.kube/
OS切換到jackhe用戶,我們能看到只有只讀權限,也無法 上下文切換到kubernetes-admin@kubernetes ,因為配置文件里並沒有相關信息。哈哈,還想刪庫跑路!!!

