本页面介绍了 Google Kubernetes Engine (GKE) 中的服务账号,以及它们如何为应用提供身份。您将了解不同类型的服务账号,以及何时使用每种类型的服务账号来验证对 GKE 中资源的访问权限,而无需依赖个人凭据。
本页面适用于创建和管理服务账号以与 GKE 应用进行交互的安全专家和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
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 CloudAPI 以及管理在 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
是您的项目编号。
如果您从项目中移除了服务代理的权限,则可以按照错误 400/403:缺少账号的修改权限中的说明恢复这些权限。
默认 GKE 节点服务账号
GKE 使用关联到节点的 IAM 服务账号来运行日志记录和监控等系统任务。这些节点服务账号必须至少拥有项目的 Kubernetes Engine Default Node Service Account (roles/container.defaultNodeServiceAccount
) 角色。默认情况下,GKE 会将 Compute Engine 默认服务账号(在您的项目中自动创建)用作节点服务账号。
如果您的组织强制执行 iam.automaticIamGrantsForDefaultServiceAccounts
组织政策限制,则项目中的默认 Compute Engine 服务账号可能无法自动获得 GKE 所需的权限。
如果您将 Compute Engine 默认服务账号用于项目或组织中的其他功能,则该服务账号可能具有超出 GKE 所需要的权限,从而使您面临安全风险。
如需向 Compute Engine 默认服务账号授予 roles/container.defaultNodeServiceAccount
角色,请完成以下步骤:
控制台
gcloud
- 找到您的 Google Cloud 项目编号:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
将
PROJECT_ID
替换为您的项目 ID。输出内容类似如下:
12345678901
- 将
roles/container.defaultNodeServiceAccount
角色授予 Compute Engine 默认服务账号:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
将
PROJECT_NUMBER
替换为上一步中的项目编号。
除非您迁移到用户管理的服务账号,否则请勿停用默认的 Compute Engine 服务账号。
何时使用特定服务账号
您使用的服务账号类型取决于您要为应用提供的身份类型,如下所示:
- 为您的 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 服务账号。
- 了解如何向主账号授予角色。