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”ServiceAccount一词来区分这些 Kubernetes 资源与其他环境(如 IAM)中的服务账号。

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

短期的不记名令牌是指由 API 服务器(OpenID Connect [OIDC] 提供方)签名的 JSON Web 令牌 (JWT)。如需验证不记名令牌,请通过调用 GKE API 中的 projects.locations.clusters.getJwks 方法获取集群的公共验证密钥。

轮替 Kubernetes 服务账号凭据

如果 Kubernetes 服务账号凭据遭到破解,请使用以下其中一种方法撤消该凭据:

  • 重新创建 Pod:不记名令牌已绑定到每个唯一的 Pod UID,因此重新创建 Pod 会使之前的凭据失效。
  • 重新创建 Kubernetes 服务账号:不记名令牌已绑定到 Kubernetes API 中服务账号对象的 UID。删除该服务账号,然后创建相同名称的新服务账号。由于新服务账号的 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 服务账号。每个 Kubernetes 命名空间都有一个 default 服务账号,但我们建议您为每个命名空间中的每个工作负载创建新的具有最低权限的服务账号。
  • 为您的 Pod 提供身份以在集群外部使用:使用适用于 GKE 的工作负载身份联合。借助适用于 GKE 的工作负载身份联合,您可以将 ServiceAccount 等 Kubernetes 资源指定为 IAM 政策中的主账号。例如,从 Pod 调用 Google Cloud API(如 Secret Manager 或 Spanner)时,使用适用于 GKE 的工作负载身份联合。
  • 为节点提供默认身份:在创建 GKE 集群或节点时,使用自定义的具有最低权限的 IAM 服务账号。如果您不使用自定义的 IAM 服务账号,则 GKE 会使用 Compute Engine 默认服务账号,该账号在您的项目中具有广泛的权限。

后续步骤