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名称空间下的资源

 

 

 

 

posted @ 2022-01-11 16:15  西风发财  阅读(1913)  评论(0编辑  收藏  举报