Service Account
在kubernetes中,有两种类型的账号,用户账号和服务账号;
用户账号被用户所使用,服务账号被机器所使用;
用户账号能够被管理员用作管理集群,或被开发人员用来在集群中部署应用;
服务账号能够被应用用来访问集群,如prometheus使用服务账号pull kuberneters api for performance metrics;自动构建工具,如jenkins使用服务账号在集群中部署应用。
如应用my kubernetes dashboard需要访问kubernetes api,访问需要被认证,此时就可以使用service account
![](https://img2022.cnblogs.com/blog/1722983/202211/1722983-20221107203524356-727266118.png)
创建serviceaccount
查看service account
查看service account详情
在创建service account时,会自动创建一个token,它被外部应用用作和kubernetes api间的认证操作
然而,token是以secret对象的形式存储的,如上dashboard-sa-token-kbbdm
因此当service account被创建时,它会首先创建service account object,然后生成一个token,接着生成secret对象,并将token存放到secret中;secret对象被链接到service account。
想要查看secret和token内容,可以使用kubectl describe secret命令
这个token接着被用作REST API的brear token,来访问kubernetes api,如你可以使用curl命令,填写bearer token即可访问kubernetes api
另外可以使用RABC,为service account赋予合适的权限,或者导出该service account到第三方应用,第三方应用使用它来认证kubernetes api。
但是如果你的第三方应用,运行或部署在Kubernetes集群内。此时可以直接挂载token到容器内部,这样当访问kubernetes api的时候,直接使用它和api server做认证。
每个命名空间被创建时,都会自动创建一个service account,如defaut命名空间下,名为default的service accout。无论pod是否被创建,默认的service accout和它的token,被自动地挂载到POD中。
如,我们有以下创建POD的定义文件,当POD被创建后,
当你查看POD时,能够看到被挂载的secret,sercret token被挂载到/var/run/secrets/kubernetes.io/serviceaccount下
从POD内部,如果你执行ls命令,列举“/var/run/secrets/kubernetes.io/serviceaccount”下的内容,能够看到该secret是以三部分的形式存在,其中token能够用来访问kubernetes api,但是需要注意的是,默认的service accout能够做的是有限的,它只允许被用来做kubernetes api的基本查询操作
如果想要使用其他的service account,可以在POD定义文件中,使用serviceAccount字段来定义
注意,你无法编辑已存在于POD内的service accout。如果确实是这样做了,请删除POD并重建。
当你此时查看volumn字段时,能看到自己所定义的service account
因此需要注意,在POD定义中,如果没有指定任何service account,kubernetes会挂载默认的service account。如果你不想要kubernetes这样做的话,可以选择不自动挂载任务service account,只需要设置spec.automountServerAccountToken:false即可