GKE 中的服务账号简介


本页面介绍 Google Kubernetes Engine (GKE) 中的服务账号,它们为应用提供身份。

服务账号是供应用(而非人员)使用的身份。在 GKE 中,您与 Kubernetes 服务账号以及 Identity and Access Management 服务账号进行交互。

Kubernetes 服务账号和 IAM 服务账号

下表介绍了 Kubernetes 服务账号和 IAM 服务账号之间的主要区别:

GKE 中的服务账号类型
Kubernetes ServiceAccount
  • Kubernetes API 服务器中的 ServiceAccount 对象
  • 限定为集群中的 Kubernetes 命名空间
  • 为 Pod 提供身份,以便在集群内使用
IAM 服务账号
  • 使用 IAM API 进行管理
  • 范围限定为 Google Cloud 项目
  • 为项目中的应用提供身份

Kubernetes ServiceAccounts

Kubernetes 服务账号在集群级层进行管理,并作为 ServiceAccount 对象存在于 Kubernetes API 服务器中。Kubernetes 文档和 GKE 文档通常使用“ServiceAccount”一词来区分这些 Kubernetes 资源与其他环境(如 IAM)中的服务账号。

您可以在命名空间中创建 Kubernetes ServiceAccount,然后使用 Pod 清单中的 serviceAccountName 字段将该 ServiceAccount 分配给 Pod。节点上的 kubelet 进程会获取已分配 ServiceAccount 的短期不记名令牌,并将该令牌作为投影的卷装载到 Pod 中。

  • 如需了解 Kubernetes ServiceAccount 的基础知识,请参阅 Kubernetes 文档中的服务账号
  • 如需了解如何创建新的 ServiceAccount、使用基于角色的访问权限控制 (RBAC) 授予权限以及将 ServiceAccounts 分配给 Pod,请参阅为 Pod 配置服务账号
  • 如需了解管理 Kubernetes ServiceAccount 时的最佳实践,请参阅 RBAC 的最佳实践

轮替 Kubernetes ServiceAccount 凭据

如果 Kubernetes 服务账号凭据遭到破解,请使用以下选项之一撤消凭据:

  • 重新创建 Pod:不记名令牌会绑定到每个唯一的 Pod UID,因此重新创建 Pod 会使之前的凭据失效。
  • 重新创建 Kubernetes 服务账号:不记名令牌绑定到 Kubernetes API 中的 ServiceAccount 对象的 UID。删除 ServiceAccount 然后创建一个具有相同名称的新 ServiceAccount。先前的令牌已失效,因为新 ServiceAccount 的 UID 不同。
  • 执行凭据轮替:此操作会撤消集群中所有的 Kubernetes 服务账号凭据。轮替还会更改集群的 CA 证书和 IP 地址。如需了解详情,请参阅凭据轮替

IAM 服务账号

IAM 服务账号使用 IAM API 在项目级层进行管理。您可以使用这些服务账号执行一些操作,例如以编程方式调用 Google Cloud API 以及管理在 Google Cloud 产品中运行的应用的权限。

如需了解详情,请参阅 IAM 服务账号概览

GKE 服务代理

IAM 服务代理是 Google Cloud 管理的 IAM 服务账号。

GKE 使用 Kubernetes Engine Service Agent 代表您管理集群资源的生命周期,例如节点、磁盘和负载均衡器。此服务代理具有网域 container-engine-robot.iam.gserviceaccount.com,并在启用时拥有项目的 Kubernetes Engine Service Agent 角色 (roles/container.serviceAgent) GKE API。

此服务代理的标识符如下所示:

service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com

PROJECT_NUMBER 是您的数字项目编号

如果您停用了 GKE 服务代理,则可以按照启用服务账号中的说明进行恢复。

如果您从项目中移除了服务代理的权限,则可以按照错误 400/403:缺少账号的修改权限中的说明恢复这些权限。

如果您删除 GKE 服务代理,则可以按照恢复删除的服务账号中的说明恢复删除。

默认 GKE 节点服务账号

默认情况下,GKE 节点使用 Compute Engine 默认服务账号。默认情况下,此服务账号会被授予 Editor 角色 (roles/editor),并且拥有的权限比 GKE 节点所需的权限多。请考虑使用使用在集群中运行节点所需的最低权限的角色。

除非您迁移到用户管理的服务账号,否则请勿停用默认的 Compute Engine 服务账号。

最低权限

GKE 需要一组最低 IAM 权限才能运行集群。如需了解如何创建最低权限 IAM 服务账号,请参阅使用最小权限 Google 服务账号

何时使用特定服务账号

您使用的服务账号类型取决于您为应用提供的身份类型,如下所示:

  • 为 Pod 提供身份以在集群中使用:使用 Kubernetes ServiceAccount。每个 Kubernetes 命名空间都有一个 default ServiceAccount,但我们建议您为每个命名空间中的每个工作负载创建新的具有最低权限的 ServiceAccount。
  • 为您的 Pod 提供身份以在集群外部使用:使用适用于 GKE 的工作负载身份联合。借助适用于 GKE 的工作负载身份联合,您可以将 ServiceAccount 等 Kubernetes 资源指定为 IAM 政策中的主账号。例如,从 Pod 调用 Google Cloud API(如 Secret Manager 或 Spanner)时,使用适用于 GKE 的工作负载身份联合。
  • 为节点提供默认身份:创建 GKE 集群或节点时,使用自定义最低权限 IAM 服务账号。如果您不使用自定义 IAM 服务账号,GKE 将使用 Compute Engine 默认服务账号,该账号在您的项目中具有广泛的权限。

后续步骤