Kubernetes 账户分类说明和账户组件介绍

2019-06-10 0 By admin

一、User Accounts 与 Service Accounts

Kubernetes区分普通帐户(user accounts)和服务帐户(service accounts)的原因:

  1. 普通帐户是针对(人)用户的,服务账户针对Pod进程。
  2. 普通帐户是全局性。在集群所有namespaces中,名称具有惟一性。
  3. 通常,群集的普通帐户可以与企业数据库同步,新的普通帐户创建需要特殊权限。服务账户创建目的是更轻量化,允许集群用户为特定任务创建服务账户。
  4. 普通帐户和服务账户的审核注意事项不同。
  5. 对于复杂系统的配置包,可以包括对该系统的各种组件的服务账户的定义。

二、Service account automation 自动化管理

三个独立的组件协作,来实现service account的自动化:

  1. 一个service account准入控制器(admission controller)
  2. 一个 Token controller
  3. 一个 service account controller

2.1、Service Account Admission Controller 组件

Kubernetes 提供了多种准入约束组件;其中这个组件将 ServiceAccount 实现了自动化。

通过 Admission Controller 插件来实现对 pod 修改,它是 apiserver 的一部分。创建或更新 pod 时会同步进行修改 pod。当插件处于激活状态(在大多数发行版中都默认情况)创建或修改pod时,会按以下操作执行:

  1. 如果 pod 创建时没有设置 ServiceAccount 资源,则将绑定一个 default 的ServiceAccount 资源。
  2. 确保 pod 引用的 ServiceAccount 资源存在,否则将会拒绝POD创建的请求。
  3. 如果 pod 不包含任何ImagePullSecrets,则将 ServiceAccount 的ImagePullSecrets 会添加到pod中。
  4. 将 ServiceAcount 中的Tocken 的资源(用于pod 向k8s apiserver 认证),绑定到pod 的volume 上。
  5. 把volumeSource添加到安装在pod的每个容器中,挂载在/var/run/secrets/kubernetes.io/serviceaccount。

2.2、Service Account Controller 组件

Service Account Controller在 namespaces 里管理 ServiceAccount,并确保每个有效的 namespaces 中都存在一个名为“default”的ServiceAccount。

2.3、Token controller 组件

可以说 Secret 资源是 ServiceAccount 资源的一部分;而 Token 资源是 Secret 资源的一部分。所以ServiceAccount 组件需要Token 组件的支持。

TokenController作为controller-manager的一部分运行。异步行为:

  1. 观察 serviceAccount 的创建,并创建一个相应的 Secret 来允许API访问。
  2. 观察 serviceAccount 的删除,并删除所有相应的 ServiceAccountToken Secret
  3. 观察 secret 添加,并确保关联的ServiceAccount存在,并在需要时向secret 中添加一个Token。
  4. 观察 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