繁体   English   中英

GKE 元数据服务器如何在 Workload Identity 中工作

[英]How does the GKE metadata server work in Workload Identity

我最近一直在使用GKE Workload Identity功能。 我有兴趣更详细地了解gke-metadata-server组件的工作原理。

  1. GCP 客户端代码( gcloud或其他语言 SDK)属于 GCE 元数据方法
  2. http://metadata.google.internal/path提出请求
  3. (猜测)在我的节点池上设置GKE_METADATA_SERVER将其配置为解析到该节点上的gke-metadata-server pod。
  4. (猜想)具有 --privileged 和主机网络的gke-metadata-server pod 具有确定源(pod IP?)然后查找 pod 及其服务帐户以检查iam.gke.io/gcp-service-account的方法iam.gke.io/gcp-service-account注释。
  5. (猜测)代理调用带有 pod '伪'身份集(例如[PROJECT_ID].svc.id.goog[[K8S_NAMESPACE]/[KSA_NAME]] )的元数据服务器,以获取在其 Kubernetes 上注释的服务帐户的令牌服务帐户。
  6. 如果此帐户对服务帐户具有令牌创建者/工作负载 ID 用户权限,则可能来自 GCP 的响应是成功的并包含一个令牌,然后将其打包并设置回调用 pod,以便对其他 Google API 进行经过身份验证的调用。

我想我现在的主要难题是验证调用 pod 的身份。 最初我认为这将使用 TokenReview API 但现在我不确定 Google 客户端工具如何知道使用挂载到 pod 中的服务帐户令牌...

编辑后续问题:

Q1:在第 2 步和第 3 步之间,对metadata.google.internal的请求是否通过在节点池上设置GKE_METADATA_SERVER路由到 GKE 元数据代理?

Q2:为什么元数据服务器 pod 需要主机联网?

Q3:在此处的视频中: https://youtu.be/s4NYEJDFc0M?t=2243假定 pod 进行了 GCP 调用。 GKE 元数据服务器如何识别发出调用以启动进程的 pod?

在详细介绍之前,请先熟悉这些组件:

OIDC 提供者:在 Google 的基础架构上运行,提供特定于集群的元数据并签署授权的 JWT。

GKE 元数据服务器:它作为 DaemonSet 运行,这意味着每个节点上都有一个实例,公开 pod 特定的元数据服务器(它将提供与旧客户端库的向后兼容性),模拟现有的节点元数据服务器。

Google IAM :颁发访问令牌、验证绑定、验证 OIDC 签名。

谷歌云:接受访问令牌,几乎可以做任何事情。

JWT : JSON Web 令牌

mTLS :相互传输层安全

以下步骤说明了 GKE 元数据服务器组件的工作原理:

第 1 步:授权用户将集群绑定到命名空间。

第 2 步:Workload 尝试使用客户端库访问 Google Cloud 服务。

第 3 步:GKE 元数据服务器将向控制平面请求 OIDC 签名的 JWT。 该连接使用带有节点凭据的双向 TLS (mTLS) 连接进行身份验证。

第 4 步:然后 GKE 元数据服务器将使用 OIDC 签名的 JWT 从 IAM 请求[identity namespace]/[Kubernetes service account]的访问令牌。 IAM 将验证身份命名空间和 OIDC 提供程序中是否存在适当的绑定。

第 5 步:然后 IAM 验证它是否由集群的正确 OIDC 提供商签名。 然后它将返回[identity namespace]/[kubernetes service account] 的访问令牌。

第 6 步:然后元数据服务器将刚刚获得的访问令牌发送回 IAM。 然后,IAM 将在验证适当的绑定后将其交换为短暂的 GCP 服务帐户令牌。

第 7 步:然后 GKE 元数据服务器将 GCP 服务帐户令牌返回给工作负载。

第 8 步:然后,工作负载可以使用该令牌调用任何 Google Cloud Service。

我还发现了一个有关 Workload Identity 的视频,您会发现它很有用。

编辑后续问题的答案:

以下是您后续问题的答案:

Q1 :在第 2 步和第 3 步之间,对 metadata.google.internal 的请求是否通过在节点池上设置 GKE_METADATA_SERVER 路由到 gke 元数据代理?

你是对的,GKE_METADATA_SERVER 设置在节点池上。 这会将元数据 API 公开给与 V1 计算元数据 API 兼容的工作负载。 一旦工作负载尝试访问 Google Cloud 服务,GKE 元数据服务器会在继续从控制平面。

请记住,只有在集群级别启用了 Workload Identity 才能启用GKE_METADATA_SERVER枚举功能。

Q2 : 为什么元数据服务器 pod 需要主机联网?

gke-metadata-server 拦截来自 pod 的所有 GCE 元数据服务器请求,但是不会拦截使用主机网络的 pod。

Q3 :GKE 元数据服务器如何识别调用启动进程的 pod?

使用 iptables 规则识别 pod。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM