什么是service account

A service account provides an identity for processes that run in a Pod

service account:服务账户,服务账户是针对运行在pod中的进程而言的

kubernetes中账户分为两种类型,用户账户和服务账户

用户账户和服务账户

  • 用户账户是针对人而言的。 服务账户是针对运行在pod中的进程而言的。
  • 用户账户是全局性的。 其名称在集群各namespace中都是全局唯一的,未来的用户资源不会做namespace隔离, 服务账户是namespace隔离的。
  • 通常情况下,集群的用户账户可能会从企业数据库进行同步,其创建需要特殊权限,并且涉及到复杂的业务流程。 服务账户创建的目的是为了更轻量,允许集群用户为了具体的任务创建服务账户 (即权限最小化原则)。
  • 对人员和服务账户审计所考虑的因素可能不同。
  • 针对复杂系统的配置可能包含系统组件相关的各种服务账户的定义。 因为服务账户可以定制化地创建,并且有namespace级别的名称,这种配置是很轻量的。

服务账户的能力

通过上文的介绍已知,服务账户是跟随Pod进程自动创建的授权体系,通过它,使用者可以在Pod所在的namespace下为所欲为(哈哈哈
且服务账户默认是开启的
也就是说,如果是一个对外开放的k8s容器平台,且某个namespace没有设置对应的quota,或者quota足够大,那么部署在其下的业务方就可以通过k8s提供的client-gorest.InClusterConfig()方法对当前namespace下进行部署(或其他)操作,这将导致集群中出现一批不受管控的pod(或可以讲作预期之外的pod以及其他资源),作为平台方应该是不希望出现这个场景的。

好在kubernetes 1.6以上版本可以手动控制禁用此能力 引用官方介绍:

In version 1.6+, you can opt out of automounting API credentials for a service account by setting automountServiceAccountToken: false on the service account:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
automountServiceAccountToken: false
...

In version 1.6+, you can also opt out of automounting API credentials for a particular pod:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot
  automountServiceAccountToken: false
  ...

The pod spec takes precedence over the service account if both specify a automountServiceAccountToken value.

所以,应该在非特殊业务场景下,禁用掉automountServiceAccountToken,从而进一步保证集群的可控性