本页面介绍了 Google Kubernetes Engine (GKE) 中为应用提供身份的服务账号。
服务账号是旨在供应用(而非个人)使用的身份。在 GKE 中,您可以与 Kubernetes 服务账号和 Identity and Access Management 服务账号进行交互。
Kubernetes 服务账号和 IAM 服务账号
下表介绍了 Kubernetes 服务账号与 IAM 服务账号之间的主要区别:
GKE 中的服务账号类型 | |
---|---|
Kubernetes ServiceAccount |
|
IAM 服务账号 |
|
Kubernetes ServiceAccounts
Kubernetes 服务账号在集群级层进行管理,并以 ServiceAccount
对象的形式存在于 Kubernetes API 服务器中。Kubernetes 文档和 GKE 文档通常使用“ServiceAccount”ServiceAccount一词来区分这些 Kubernetes 资源与其他环境(如 IAM)中的服务账号。
您可以在命名空间中创建 Kubernetes ServiceAccount,然后使用 Pod 清单中的 serviceAccountName
字段将该 ServiceAccount 分配给 Pod。节点上的 kubelet 进程会为已分配的 ServiceAccount 获取短期的不记名令牌,并将该令牌作为投影卷装载到 Pod 中。
短期的不记名令牌是指由 API 服务器(OpenID Connect [OIDC] 提供方)签名的 JSON Web 令牌 (JWT)。如需验证不记名令牌,请通过调用 GKE API 中的 projects.locations.clusters.getJwks
方法获取集群的公共验证密钥。
- 如需了解 Kubernetes ServiceAccount 的基础知识,请参阅 Kubernetes 文档中的服务账号。
- 如需了解如何创建新的 ServiceAccount、使用基于角色的访问控制 (RBAC) 授予权限以及将 ServiceAccount 分配给 Pod,请参阅为 Pod 配置 ServiceAccount。
- 如需了解管理 Kubernetes ServiceAccount 时的最佳实践,请参阅 RBAC 的最佳实践。
- 如需读取集群 Kubernetes API 服务器的 OIDC 配置,请在 GKE API 中调用
projects.locations.clusters.well-known.getOpenid-configuration
方法。
变换 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 默认服务账号,该账号在您的项目中具有广泛的权限。
后续步骤
- 了解如何使用最小权限 Google 服务账号。
- 了解如何向主账号授予角色。