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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
apiVersion: v1
kind: ServiceAccount
metadata:
name: test
namespace: default
autoMountServiceAccountToken: true
创建POD使用该ServiceAccount
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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名称空间下的资源