本页面介绍了“舰队工作负载身份联合”,这是一种用于对从舰队工作负载到 Google Cloud API 的请求进行身份验证的机制。在此页面上,您可以了解工作负载的身份相同性、舰队工作负载身份联合的工作原理,以及大规模管理它的良好实践。
本页面适用于平台管理员和运维人员,以及希望更高效地大规模管理工作负载授权的安全工程师。如需详细了解我们在 Google Cloud文档中提及的用户角色和示例任务,请参阅常见的 GKE 用户角色和任务。
在阅读本页面之前,请确保您熟悉以下概念:
Google Cloud中的联合工作负载身份简介
“工作负载身份联合”是一项 Google Cloud 功能,可让集群中的工作负载向 Google Cloud 进行身份验证,而无需下载、手动轮替和以常规方式管理凭证。相反,工作负载会使用 Google Cloud生成的短期有效令牌进行身份验证。
Workload Identity Federation for GKE 是工作负载身份联合的 GKE 特定实现,可提供一个项目级的 Google 管理的“工作负载身份池”,在该池中,在 GKE 集群中运行的应用可获取身份。舰队工作负载身份联合可将 Workload Identity Federation for GKE 扩展到所有舰队成员集群,无论这些集群位于不同的项目中还是位于 Google Cloud之外。借助舰队 Workload Identity 联合,已注册的集群(如果其舰队成员资格启用了 Workload Identity 联合)可以使用舰队范围的 Google 管理的工作负载身份池获取身份。借助此共享池,您可以在整个舰队(甚至多个项目)中配置针对 Google Cloud API 和其他服务的身份验证。
Connect Agent 还可以在某些集群类型上使用舰队工作负载身份联合作为舰队成员资格的一部分向 Google Cloud 进行身份验证,并且需要使用某些能够跨项目运行的 GKE Enterprise 功能,例如 Cloud Service Mesh。
工作负载身份池简介
工作负载身份池是一种实体,可集中管理应用的身份。在集群上启用 Workload Identity Federation for GKE 时,集群项目会获得一个由 Google 管理的工作负载身份池,该池具有固定的项目专用名称。集群中的应用会从 Google 管理的工作负载身份池获取身份,以对 Google Cloud API 调用进行身份验证。Google 管理的工作负载身份池的语法为 PROJECT_ID.svc.id.goog
,其中 PROJECT_ID
是集群项目 ID。
借助舰队工作负载身份联合,舰队宿主项目的 Google 管理的工作负载身份池也是您注册到舰队的所有集群的工作负载身份池,无论这些集群位于其他项目中还是位于 Google Cloud之外。舰队中的每个集群都使用 FLEET_HOST_PROJECT_ID.svc.id.goog
工作负载身份池,其中 FLEET_HOST_PROJECT_ID
是舰队宿主项目的项目 ID。
如果您使用团队范围,则可以选择性地为集群配置自行管理的 IAM 工作负载身份池,以供集群在 Google 管理的池之外使用。通过此自行管理的池,您可以更明确地控制哪些工作负载获得特定身份。
舰队中的每个应用都会从舰队的工作负载身份池中获得一个不同的联合身份,该应用可以使用此身份向Google Cloud 和您开发的其他服务进行身份验证。应用会获得 IAM 可以识别的主账号标识符。此标识符使用以下语法:
PREFIX://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/WORKLOAD_IDENTITY_POOL_NAME/SELECTOR
此语法包含以下字段:
PREFIX
:principal
或principalSet
,具体取决于您在 SELECTOR 字段中选择的 Kubernetes 资源类型。FLEET_PROJECT_NUMBER
:舰队宿主项目的编号。WORKLOAD_IDENTITY_POOL_NAME
:您的舰队的工作负载身份池。此值取决于您在每个集群中设置的工作负载身份池,如下所示:Google 管理的工作负载身份池:
FLEET_HOST_PROJECT_ID.svc.id.goog
自行管理的工作负载身份池(预览版):
POOL_NAME.global.POOL_HOST_PROJECT_NUMBER.workload.id.goog
,其中POOL_HOST_PROJECT_NUMBER
是您在其中创建了自行管理的工作负载身份池的项目的项目编号。
SELECTOR
:资源选择器。如需查看支持的选择器列表,请参阅支持的主账号标识符部分。例如,subject/ns/NAMESPACE/sa/SERVICEACCOUNT
会选择特定命名空间中的特定 Kubernetes ServiceAccount。
整个舰队共享一个舰队工作负载身份池,因此您可以向舰队中任何位置(包括其他项目或云端)的应用授予对同一资源的访问权限,而无需为每个集群管理访问权限。
身份相同性简介
与其他支持舰队的功能一样,舰队工作负载身份联合依赖于相同性原则,即不同集群中具有相同名称和命名空间的 Kubernetes 对象将被视为同一项。如需详细了解舰队中的一般相同性原则,请参阅相同性。
对于单项目 Workload Identity Federation for GKE,身份相同性适用于该项目中共享同一主账号标识符的所有实体。不过,借助舰队工作负载身份联合,这种身份相同性会隐式应用于整个舰队中共享同一主账号标识符的所有实体,而无论集群项目如何。
例如,假设某应用的后端部署在同一舰队中的多个集群上。如果您向选择 backend
Kubernetes 命名空间中 default
Kubernetes ServiceAccount 的主账号标识符授予角色,则该命名空间中任何使用该 ServiceAccount 的应用都会获得相同的访问权限。
如果您的舰队仅在舰队宿主项目中运行集群,则身份相同性影响与 Workload Identity Federation for GKE 相同。不过,如果您的舰队包含在其他项目中或在Google Cloud之外运行的集群,则这种隐式身份相同性会扩展到舰队中的所有已注册集群。
多租户或混合信任环境中的身份相同性
默认情况下,您的舰队使用舰队宿主项目的 Google 管理的工作负载身份池为整个舰队中的工作负载提供身份。舰队宿主项目中的所有集群(包括未注册到舰队的独立集群)都使用此工作负载身份池。在混合信任环境中,这些独立集群运行的工作负载具有不同的信任模型,这种隐式身份相同性可能会导致意外访问。
借助舰队,您可以使用团队范围和舰队命名空间来管理此多租户模型。借助团队范围,您可以指定舰队资源(例如集群)的子集,以供组织中的特定团队使用。借助舰队命名空间,您可以在特定团队范围内定义 Kubernetes 命名空间,以便特定团队只能在其团队范围内的命名空间中运行工作负载。如需了解详情,请参阅舰队团队管理概览。
如果您使用团队范围,则可以为舰队中的特定集群配置您自己的工作负载身份池,以取代 Google 管理的工作负载身份池,从而缓解多租户舰队中的身份相同性复杂问题。因此,这些工作负载的主账号标识符与项目中独立集群的主账号标识符明显不同。这种显式身份相同性可让管理员更好地控制身份相同性适用的边界。
舰队中的身份相同性模型会根据您是仅使用 Google 管理的工作负载身份池还是配置自行管理的工作负载身份池而发生如下变化:
- 隐式身份相同性:舰队中的所有工作负载都使用 Google 管理的工作负载身份池。因此,共享同一主账号标识符的每个工作负载都会隐式共享同一访问权限。
显式身份相同性(预览版):您为舰队中的团队范围配置自行管理的工作负载身份池。只有在您配置集群以针对特定舰队命名空间使用自行管理的池时,自行管理的池才会向工作负载提供身份。在其他 Kubernetes 命名空间和集群中运行的工作负载无法使用自行管理的池。
因此,使用自行管理的池的工作负载的身份相同性与只能使用 Google 管理的工作负载身份池的工作负载的身份相同性不同。
何时使用自行管理的工作负载身份池
如果每个集群的信任级别相似,并且由相同的实体部署相同的应用,请使用 Google 管理的工作负载身份池。例如,一个团队专用舰队,其中每个区域都有一个集群,每个集群中都部署了一个复制的应用。
我们建议您在以下情况下为舰队配置自行管理的工作负载身份池:
- 舰队中的多个信任级别:您运行的集群具有多个信任级别。例如,假设财务团队和前端团队在同一舰队中拥有集群。借助自行管理的工作负载身份池,您可以按舰队命名空间为每个团队分离访问权限授予。这意味着,即使是前端集群的集群管理员,除非拥有明确的权限,否则也无法在舰队命名空间中获取身份。
- 项目中的信任级别不一致:您的舰队宿主项目运行的独立集群可能与舰队集群的信任级别不同。默认情况下,这些独立集群使用舰队宿主项目的 Google 管理的工作负载身份池。无论舰队集群项目是什么,舰队集群也会使用此工作负载身份池。为舰队设置自行管理的工作负载身份池可确保对自行管理的池授予的访问权限不会无意中授予对独立集群的访问权限。
- 团队范围的最佳实践:您已使用舰队团队管理功能,并希望实施建议的最佳实践来授予对工作负载的访问权限。设置自行管理的工作负载身份池后,您可以向团队范围中特定舰队命名空间中的工作负载授予访问权限,而无需向在同一集群中运行工作负载的其他团队范围授予该访问权限。
舰队工作负载身份联合的工作原理
以下部分介绍了舰队工作负载身份联合的工作原理,包括身份验证凭证的流程和支持的 IAM 主账号标识符。
凭据流程
如需让特定命名空间中的应用使用舰队工作负载身份联合进行身份验证,请执行以下操作:
在该命名空间中部署包含以下信息的 ConfigMap:
- 集群的工作负载身份池和身份提供方。
- Kubernetes 将 ServiceAccount 令牌挂载到每个 Pod 的路径。此令牌是已签名的 JSON Web 令牌 (JWT)。
此 ConfigMap 充当工作负载的应用默认凭据 (ADC) 文件。
创建 IAM 允许政策,向集群中主账号的主账号标识符(例如命名空间中的 ServiceAccount)授予对特定Google Cloud 资源的访问权限。
确保命名空间中的工作负载在 Pod 规范中具有以下配置:
GOOGLE_APPLICATION_CREDENTIALS
环境变量设置为 Pod 中 ConfigMap 的装载路径。- 包含 ServiceAccount 令牌和您创建的 ConfigMap 的预测卷,该卷已装载到您在
GOOGLE_APPLICATION_CREDENTIALS
环境变量中指定的路径。 - 容器中引用投影卷的卷装载。
当工作负载发出 Google Cloud API 调用时,会执行以下步骤:
- Google Cloud 身份验证库使用应用默认凭据 (ADC) 查找凭据。ADC 会检查您在
GOOGLE_APPLICATION_CREDENTIALS
环境变量中指定的路径,以查找身份验证令牌。 - ADC 身份验证库使用 ConfigMap 中的数据将您装载到 Pod 上的 ServiceAccount JWT 交换为来自 Security Token Service 的短期有效联合访问令牌,该令牌引用工作负载的主账号标识符。
- ADC 会在 API 请求中添加联合访问令牌。
- IAM 允许政策授权主账号标识符对 Google Cloud 资源执行所请求的操作。
适用于舰队工作负载身份联合的支持的主账号标识符
下表介绍了您可以在 IAM 中使用的选择器,以允许政策引用舰队中的正文:
主账号标识符类型 | 语法 |
---|---|
使用特定 Kubernetes ServiceAccount 的所有 Pod | 按名称选择 ServiceAccount:
principal://iam.googleapis.com/projects/ 替换以下内容:
按 UID 选择 ServiceAccount: principal://iam.googleapis.com/projects/ 替换以下内容:
|