K8S權限管理-SERVICEACCOUNT


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>   #
demo.yaml

例如創建一個test ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  name: test
  namespace: default
autoMountServiceAccountToken: true 
tets-demo.yaml

 創建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
test-pod.yaml

 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名稱空間下的資源

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM