1、serviceacount
Kubernets API 中的資源類型,用於讓POD對象內部的應用程序在與API Server通信是完成身份認證,屬於名稱空間級別
名為ServiceAccount的准入控制器實現了服務賬戶的自動化,它會為每個名稱空間自動生成一個名稱為default的默認資源對象
1.1、命令式創建指定的ServiceAccount
kubectl create serviceaccount xx
如在default名稱空間增加一個test serviceaccount :
kubectl create serviceaccount test
可以看到自動生成了一個Secret對象,以后使用ServiceAccount的pod會將這個secret對象默認掛載在pod /var/run/secrets/kibernets.io/serviceaccount目錄的三個文件,用於pod內部的應用與API Server完成認證
注意:kubernets在v1.24以后創建servieaccount不會自動創建secret,需要手動創建secret,然后關聯。如:https://zhuanlan.zhihu.com/p/519754887
1.2、資源清單創建ServiceAccount

apiVersion: v1 kind: ServiceAccount metadata: name <string> #資源名稱 namespace <string> #所屬名稱空間 autoMountServiceAccountToken <boolean> #是否讓POD自動掛載API令牌 secrets: <[]Object> #以該SA運行的POD要使用的secret對象所組成的列表 apiVersion: <string> #Secret對象所屬的API群組和版本,可以省略 kind: <string> #資源類型,secret,可省略 name: <string> #引用的secret對象名稱 namespace: <string> #secrets所屬的名稱空間 uid: <string> #secret對象標識符 imagePullSecrets <[]object>: #引用用於下載容器鏡像的Secret對象列表,用於pod在拉取容器鏡像時,提前完成與鏡像倉庫的身份認證 name <string> #
例如創建一個test ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
name: test
namespace: default
autoMountServiceAccountToken: true
創建POD使用該ServiceAccount

apiVersion: v1
kind: Pod
metadata:
name: testwithsa
namespace: default
spec:
containers:
- name: amdinbox
image: ikubernetes/admin-toolbox:v1.0
imagePullPolicy: Always
serviceAccountName: test
kubectl get pod -n default -o wide -o yaml
可以看到自動生成了一個volume:kube-api-access-hwzrd,3個path:token/ca.crt/namespace,對應在容器/var/run/secrets/kibernets.io/serviceaccount目錄下
POD內:
(1)在pod與API server交互時,工作負載進程會使用該目錄下的ca.crt證書文件驗證API Server的服務器證書是否是所在集群kubernetes-ca簽發
(2)服務器身份驗證通過后,工作負載向API server請求操作namespace文件指定的名稱空間中的資源時,會將token文件中的令牌以承載令牌的認證方式提交給API Server進行驗證,權限驗證則由授權插件完成
早容器中使用curl向API Server發起訪問請求
cd /var/run/secrets/kubernetes.io/serviceaccount
curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://10.0.8.101:6443/namespace/$(cat ./namespace)/
可以看到,該serviceaccount沒有管理default名稱空間的權限,給該serviceaccount授予default名稱空間的管理權限(也可以通過資源清單創建)
kubectl create rolebinding namespace-default-admin --clusterrole=admin --serviceaccount=default:test -n default
在pod內驗證:
cd /var/run/secrets/kubernetes.io/serviceaccount
curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://10.0.8.101:6443/api/v1/namespaces/$(cat ./namespace)/
頁面驗證:
獲取serviceacount token
復制token的值登錄管理頁面:
只能看到default名稱空間下的資源