k8s的認證:node
與API server通訊的客戶端大體有兩類:
1.集羣客戶端工具(kubectl、kubeadm、kubelet等)
2.集羣內pod.nginx
任何客戶端訪問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)。
docker
建立一個sa:api
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在鏡像倉庫中拉取鏡像,如果私有鏡像倉庫,則須要提供帳戶及密鑰,此時的解決方法有兩種:app
1.直接在定義pod時定義imagePullSecret。(較不安全)模塊化
2.建立單獨的帳戶(sa),在sa中定義imagePullSecret,而後在建立pod時定義serviceAccountName爲此sa名稱。工具