User Accounts 与 Service Accounts
Kubernetes区分普通帐户(user accounts)和服务帐户(service accounts)的原因:
- 普通帐户是针对(人)用户的,服务账户针对Pod进程。
- 普通帐户是全局性。在集群所有namespaces中,名称具有惟一性。
- 通常,群集的普通帐户可以与企业数据库同步,新的普通帐户创建需要特殊权限。服务账户创建目的是更轻量化,允许集群用户为特定任务创建服务账户。
- 普通帐户和服务账户的审核注意事项不同。
- 对于复杂系统的配置包,可以包括对该系统的各种组件的服务账户的定义。
Service account automation
三个独立的组件协作,来实现service account的自动化:
- 一个service account准入控制器(admission controller)
- 一个 Token controller
- 一个service account controller
Service Account Admission Controller
通过 Admission Controller插件来实现对pod修改,它是apiserver的一部分。创建或更新pod时会同步进行修改pod。当插件处于激活状态(在大多数发行版中都默认情况)创建或修改pod时,会按以下操作执行:
- 如果pod没有设置ServiceAccount,则将ServiceAccount设置为default。
- 确保pod引用的ServiceAccount存在,否则将会拒绝请求。
- 如果pod不包含任何ImagePullSecrets,则将ServiceAccount的ImagePullSecrets会添加到pod中。
- 为包含API访问的Token的pod添加了一个volume。
- 把volumeSource添加到安装在pod的每个容器中,挂载在/var/run/secrets/kubernetes.io/serviceaccount。
Token controller
TokenController作为controller-manager的一部分运行。异步行为:
- 观察serviceAccount的创建,并创建一个相应的Secret 来允许API访问。
- 观察serviceAccount的删除,并删除所有相应的ServiceAccountToken Secret
- 观察secret 添加,并确保关联的ServiceAccount存在,并在需要时向secret 中添加一个Token。
- 观察secret 删除,并在需要时对应 ServiceAccount 的关联
需要使用--service-account-private-key-file 参数选项将Service Account 密匙(key)文件传递给controller-manager中的Token controller。key用于 Service Account Token签名。同样,也需要使用--service-account-key-file 参数选项将相应的(public key)公匙传递给kube-apiserver ,公钥用于在认证期间验证Token。
To create additional API tokens
controller loop能确保每个Service Account都存在一个带有API Token的secret 。如要为Service Account创建额外的API Token,可以使用创建ServiceAccountToken类型的secret,添加与Service Account对应的 annotation 属性,controller会更新令牌:
secret.json:
{ "kind": "Secret", "apiVersion": "v1", "metadata": { "name": "mysecretname", "annotations": { "kubernetes.io/service-account.name": "myserviceaccount" } }, "type": "kubernetes.io/service-account-token" }
kubectl create -f ./secret.json kubectl describe secret mysecretname
要删除/使Service Account token无效
kubectl delete secret mysecretname
Service Account Controller
Service Account Controller在namespaces里管理ServiceAccount,并确保每个有效的namespaces中都存在一个名为“default”的ServiceAccount。