k8s無法直接創建用戶,只能通過簽發集群的證書機構簽名的證書的形式創建用戶,用戶使用證書證明自己的身份(證書中的CN可以理解為用戶名),來訪問集群。RBAC再根據用戶權限來鑒權。
賬號分為用戶賬號和服務賬號。用戶賬號給個人使用,是全局唯一的;服務賬號是給運行在Pod中的進程使用,是命名空間級別的,1.22版本前服務賬號的憑證保存在Secret中。
SA作用
- Pod與K8S api-server之間通信。
- 與外部服務通信。
- 免密拉取私有鏡像。
- 外部服務與api-server通信。
使用方式
- 創建SA賬號。
- 給SA賬號綁定RBAC權限。
- 將SA添加到Pod Spec中。
控制器
SA控制器作用(SA controller)
- 確保每個命名空間內都有一個名為default的sa,Pod默認都會掛載該sa。
令牌控制器作用(Token controller)
為SA綁定訪問token,可以是臨時的也可以是永久的。
- 監控sa的刪除,并刪除對應的secret。
- 監控sa secret的創建,向SA中添加secret。
- 監控sa secret的刪除,從SA中刪除secret。
SA準入控制器作用(SA admission controller)
創建Pod時會修改Pod
- 如果Pod沒有設置serviceAccountName,則為其設置為default。
- 檢查Pod引用的SA存在,若不存在則Pod創建失敗。
- 如果SA中的automountServiceAccountToke設置為false,且Pod的automountServiceAccountToke也為false,則為Pod添加一個額外volume,volume中包含api access token,并將volume掛載到Pod的每一個container中,掛載路徑為/var/run/secrets/kubernetes.io/serviceaccount。
- 如果Pod沒有設置imagePullSecrets,則從其配置的SA中找到imagePullSecrets并添加到Pod中。
SA賬號的token
token有兩種獲取方式,一種是TokenRequest API自動獲取臨時token,一種是給SA綁定secret。1.22版本之前,k8s使用的是secret,之后使用的是臨時token。
K8S會自動給Pod的SA創建token,SA準入控制器會將token作為projected volume到Pod中,kubelet會定期更新token。如果Pod設置automountServiceAccountToke為false則不會掛載token到Pod中。
kubectl create token build-robot --duration xxx
手動創建token并指定有效期。手動將secret作為SA的永久token。# k8s會在data中自動補充token主鍵。
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: mysecretname
annotations:
kubernetes.io/service-account.name: myserviceaccount
data:
extra: YMFyCg==
- 給SA配置拉取鏡像的imagePullSecrets
apiVersion: v1
kind: ServiceAccount
metadata:
name: myserviceaccount
namespace: default
imagePullSecrets:
- name: myregistrykey
secrets:
- name: mysceretname