GKE 工作负载身份池 VS 来自工作负载身份联合的工作负载身份池

GKE workload identity pool VS workload identity pools from workload identity federation

Google docu says that workload identity could be used to authorise GKE pods to consume services provided by Google APIs (and it works fine). It also says 将有一个名为 PROJECT_ID.svc.id.goog.

的自动创建的身份池

Docu about workload identity federation 说:“您可以使用工作负载身份池来组织和管理外部身份。”

在我按照 here (and it works fine) I am trying to retrieve workload identity pools existing in my project and I expect to see PROJECT_ID.svc.id.goog. I am using this command 所述配置工作负载身份以列出池后:gcloud beta iam workload-identity-pools list --location="global" --show-deleted 作为输出,我得到:

local@local:~/$ gcloud beta iam workload-identity-pools list --location="global"
Listed 0 items.

那么 GKE workload identity pool and workload identity pools,来自工作负载身份联合,只是两个绝对独立的实体吗?或者它只是 beta API 并不能完全正常工作?或者它是第三种东西?

有时很难为产品找到正确的名称。 2 种不同产品的 2 个非常相似的名称。 -> 那是你的错误。


Workload Identity 是一个 GKE 插件。在深入之前,您必须知道,在 Google Cloud Platform 上,您不需要使用服务帐户密钥文件,因为服务帐户会自动加载到每个服务(Compute Engine、App Engine、Cloud 运行, Cloud Function, Cloud Build,...) 并可通过 metadata server 访问。 Google 云客户端库自动检测环境并使用元数据服务器(如果存在)。

GKE 的问题在于,您可以 运行 在多个不同的 Compute Engine 实例(节点)上放置容器,并且您的不同服务(K8S 服务)可以具有不同级别的授权。如果您依赖 Compute Engine 服务帐户(没有工作负载身份插件的默认行为),则相同实例上的所有 pods 使用相同的服务帐户(因此具有相同的权限)。

为了解决这个问题,Workload Identity 插件创建了一个代理来拦截元数据服务器调用,并在 GKE

上使用正确的绑定服务帐户回复此 pods/service

工作负载身份池完全不同。其原理是配置第三方身份提供者(例如AWS、Okta,甚至是自定义)并定义接受第三方令牌的条件(电子邮件、索赔、...)。

接受令牌后,您可以执行调用以模拟服务帐户,从而生成一个新令牌(这次是 Google 兼容的令牌),您将能够在后续使用来电。

这里的原则是避免使用服务账号密钥文件,依赖第三方身份提供者与GCP交互。例如,在 AWS 上您需要调用 BigQuery,您可以使用 Workload 身份池和您的 AWS 身份创建一个令牌,然后调用 BigQuery,而无需在平台之间交换秘密。

注意:保守秘密的最好方法就是不要有秘密!