Service Account

简介

Service Account为Pod中的进程提供身份信息。

注意本文是关于 Service Account 的用户指南,管理指南另见 Service Account 的集群管理指南 。

本文档描述的关于 Serivce Account 的行为只有当您按照 Kubernetes 项目建议的方式搭建起集群的情况下才有效。您的集群管理员可能在您的集群中有自定义配置,这种情况下该文档可能并不适用。

当您(真人用户)访问集群(例如使用kubectl命令)时,apiserver 会将您认证为一个特定的 User Account(目前通常是admin,除非您的系统管理员自定义了集群配置)。Pod 容器中的进程也可以与 apiserver 联系。 当它们在联系 apiserver 的时候,它们会被认证为一个特定的 Service Account(例如default

Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。它与 User account 不同

  • User account 是为人设计的,而 service account 则是为 Pod 中的进程调用 Kubernetes API 而设计;

  • User account 是跨 namespace 的,而 service account 则是仅局限它所在的 namespace;

  • 每个 namespace 都会自动创建一个 default service account

  • Token controller 检测 service account 的创建,并为它们创建 secret

  • 开启 ServiceAccount Admission Controller 后

    • 每个 Pod 在创建后都会自动设置 spec.serviceAccountName 为 default(除非指定了其他 ServiceAccout)

    • 验证 Pod 引用的 service account 已经存在,否则拒绝创建

    • 如果 Pod 没有指定 ImagePullSecrets,则把 service account 的 ImagePullSecrets 加到 Pod 中

    • 每个 container 启动后都会挂载该 service account 的 token 和 ca.crt/var/run/secrets/kubernetes.io/serviceaccount/

$ kubectl exec nginx-3137573019-md1u2 ls /var/run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token

使用默认的 Service Account 访问 API server

当您创建 pod 的时候,如果您没有指定一个 service account,系统会自动得在与该pod 相同的 namespace 下为其指派一个default service account。如果您获取刚创建的 pod 的原始 json 或 yaml 信息(例如使用kubectl get pods/podename -o yaml命令),您将看到spec.serviceAccountName字段已经被设置为 default

您可以在 pod 中使用自动挂载的 service account 凭证来访问 API,如 Accessing the Cluster 中所描述。

Service account 是否能够取得访问 API 的许可取决于您使用的 授权插件和策略

在 1.6 以上版本中,您可以选择取消为 service account 自动挂载 API 凭证,只需在 service account 中设置 automountServiceAccountToken: false

在 1.6 以上版本中,您也可以选择只取消单个 pod 的 API 凭证自动挂载:

如果在 pod 和 service account 中同时设置了 automountServiceAccountToken , pod 设置中的优先级更高。

使用多个Service Account

每个 namespace 中都有一个默认的叫做 default 的 service account 资源。

您可以使用以下命令列出 namespace 下的所有 serviceAccount 资源。

您可以像这样创建一个 ServiceAccount 对象:

如果您看到如下的 service account 对象的完整输出信息:

然后您将看到有一个 token 已经被自动创建,并被 service account 引用。

您可以使用授权插件来 设置 service account 的权限

设置非默认的 service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为您想要用的 service account 名字即可。

在 pod 创建之初 service account 就必须已经存在,否则创建将被拒绝。

您不能更新已创建的 pod 的 service account。

您可以清理 service account,如下所示:

手动创建 service account 的 API token

假设我们已经有了一个如上文提到的名为 ”build-robot“ 的 service account,我们手动创建一个新的 secret。

现在您可以确认下新创建的 secret 取代了 “build-robot” 这个 service account 原来的 API token。

所有已不存在的 service account 的 token 将被 token controller 清理掉。

注意:该内容中的token被省略了。

为 service account 添加 ImagePullSecret

首先,创建一个 imagePullSecret,详见这里

然后,确认已创建。如:

然后,修改 namespace 中的默认 service account 使用该 secret 作为 imagePullSecret。

Vi 交互过程中需要手动编辑:

现在,所有当前 namespace 中新创建的 pod 的 spec 中都会增加如下内容:

授权

Service Account 为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合 RBAC 来为 Service Account 鉴权:

在api中添加

  • 配置 --authorization-mode=RBAC--runtime-config=rbac.authorization.k8s.io/v1alpha1

  • 配置 --authorization-rbac-super-user=admin

  • 定义 Role、ClusterRole、RoleBinding 或 ClusterRoleBinding

比如

或者以这为例

Last updated