k8s的認證:
與API server通信的客戶端大致有兩類:
1.集群客戶端工具(kubectl、kubeadm、kubelet等)
2.集群內pod.
任何客戶端訪問k8s時的過程:
1.認證:任何客戶端訪問k8s,首先需要通過k8s的認證;認證通過是說明所用賬號只是k8s的合法用戶;
2.授權:認證通過后,是否具有對k8s集群中資源的操作,需要k8s對其進行授權檢查;
3.准入控制:授權檢查通過后,並不能說明你的操作都在我們指定的操作范圍內;進一步補充授權。
認證:k8s中常見的認證方式有:token令牌認證和SSL認證。
授權:k8s中常見的授權方式有:Node、ABAC(Attribute Base Access Control基於屬性的訪問控制)、RBAC(Role Base Access Control基於角色的訪問控制)
k8s是高度模塊化設計的,認證、授權、准入控制等,都通過插件方式部署,可由用戶自定義選擇經由什么樣的插件來完成何種控制邏輯。
每個名稱空間下都會有一個默認的token,該名稱空間下的pod使用默認使用這個token來與API Servre通信。
kubeadm初始化后生成的客戶端證書和私鑰在:.kube/config
k8s的kubectl等客戶端工具對集群操作時,命令被轉化為一個http協議的請求:
如:若想訪問default名稱空間下的deployment控制器生成的nignx pod時的URL路徑為:
http://node_ip:node_port/apis/apps/v1/namespaces/default/deployments/nginx
service account(sa):
kubernetes集群有兩類認證時的賬號:
user account(管理者、訪問者)、service account(pod)。
創建一個sa:
1 kubectl create serviceaccount SA_NAME
若要對單獨或一組pod使用單獨token來實現權限的提升或者降級,需要單獨創建pod賬戶(Service account)。
service account簡寫sa,創建一個sa的同時,系統會自動給這個sa生成一個token,用於使創建的sa連接API Server 。
查看某個pod使用的sa:kubectl describe pods POD_NAME 在輸出的結果中尋找volumes段的SecretName。
pod若要使用某個自定義sa時,須在創建Pod時,在pod的資源清單中添加SA_NAME(spec.serviceAccountName:SA_NAME)。
例:k8s創建pod時,需要docker在鏡像倉庫中拉取鏡像,若是私有鏡像倉庫,則需要提供賬戶及密鑰,此時的解決方法有兩種:
1.直接在定義pod時定義imagePullSecret。(較不安全)
2.創建單獨的賬戶(sa),在sa中定義imagePullSecret,然后在創建pod時定義serviceAccountName為此sa名稱。