什么是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-go
,rest.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
,从而进一步保证集群的可控性
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。