Service Account

在kubernetes中,有两种类型的账号,用户账号和服务账号;

用户账号被用户所使用,服务账号被机器所使用;

用户账号能够被管理员用作管理集群,或被开发人员用来在集群中部署应用;

服务账号能够被应用用来访问集群,如prometheus使用服务账号pull kuberneters api for performance metrics;自动构建工具,如jenkins使用服务账号在集群中部署应用。

 

如应用my kubernetes dashboard需要访问kubernetes api,访问需要被认证,此时就可以使用service account

 

 创建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即可

 

 

posted @ 2022-11-07 20:40  cosmoswong  阅读(418)  评论(0编辑  收藏  举报