GKE 元数据服务器如何在 Workload Identity 中工作
How does the GKE metadata server work in Workload Identity
我最近一直在使用 GKE Workload Identity 功能。我有兴趣更详细地了解 gke-metadata-server
组件的工作原理。
- GCP 客户端代码(
gcloud
或其他语言 SDK)落入 GCE 元数据方法
- 已向
http://metadata.google.internal/path
提出请求
- (猜测)在我的节点池上设置
GKE_METADATA_SERVER
将其配置为解析到该节点上的 gke-metadata-server
pod。
- (猜测)具有 --privileged 和主机网络的
gke-metadata-server
pod 有一种确定源(pod IP?)然后查找 pod 及其服务帐户以检查 iam.gke.io/gcp-service-account
注解.
- (猜测)代理使用 pods 'pseudo' 身份集(例如
[PROJECT_ID].svc.id.goog[[K8S_NAMESPACE]/[KSA_NAME]]
)调用元数据服务器,以获取在其 Kubernetes 服务帐户上注释的服务帐户的令牌.
- 如果此帐户对服务帐户具有令牌创建者/工作负载 ID 用户权限,则可能来自 GCP 的响应是成功的并包含一个令牌,然后将其打包并设置回调用 pod 以对其他 Google APIs.
我想我现在的主要难题是验证调用 pods 身份。最初我认为这会使用 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 签名。
Google 云:接受访问令牌,几乎可以做任何事情。
JWT: JSON 网络令牌
mTLS:相互传输层安全
以下步骤解释了 GKE 元数据服务器组件的工作原理:
步骤 1:授权用户将集群绑定到命名空间。
步骤 2:工作负载尝试使用客户端库访问 Google 云服务。
步骤 3:GKE 元数据服务器将从控制平面请求 OIDC 签名的 JWT。该连接使用带有节点凭证的相互 TLS (mTLS) 连接进行身份验证。
第 4 步:然后 GKE 元数据服务器将使用 OIDC 签名的 JWT 为 [身份命名空间]/[Kubernetes 服务请求访问令牌来自 IAM 的帐户]。 IAM 将验证身份命名空间和 OIDC 提供商中是否存在适当的绑定。
第 5 步:然后 IAM 验证它是否由集群的正确 OIDC 提供商签名。然后它将 return [身份命名空间]/[kubernetes 服务帐户] 的访问令牌。
第6步:然后元数据服务器将它刚刚得到的访问令牌发送回IAM。然后,IAM 将在验证适当的绑定后将其交换为短期 GCP 服务帐户令牌。
第 7 步:然后 GKE 元数据服务器 return 将 GCP 服务帐户令牌发送给工作负载。
步骤 8:然后工作负载可以使用该令牌调用任何 Google 云服务。
我还找到了关于工作负载身份的 video,您会发现它很有用。
编辑后续问题的答案:
以下是您后续问题的答案:
Q1:在第 2 步和第 3 步之间,对 metadata.google.internal 的请求是否通过节点上的设置 GKE_METADATA_SERVER 路由到 gke 元数据代理游泳池?
你说得对,GKE_METADATA_SERVER是在节点池上设置的。这将元数据 API 公开给与 V1 计算元数据 API 兼容的工作负载。一旦工作负载尝试访问 Google 云服务,GKE 元数据服务器在继续请求之前执行查找(元数据服务器检查列表中是否存在 IP 与请求的传入 IP 匹配的 pod)来自控制平面的 OIDC 令牌。
请记住,只有在集群级别启用了 Workload Identity 才能启用 GKE_METADATA_SERVER 枚举功能。
Q2: 为什么metadata server pod需要host联网?
gke-metadata-server 拦截来自 pods 的所有 GCE 元数据服务器请求,但是 pods 使用主机网络不会被拦截。
Q3:GKE元数据服务器如何识别调用启动进程的pod?
使用 iptables 规则识别 pods。
我最近一直在使用 GKE Workload Identity 功能。我有兴趣更详细地了解 gke-metadata-server
组件的工作原理。
- GCP 客户端代码(
gcloud
或其他语言 SDK)落入 GCE 元数据方法 - 已向
http://metadata.google.internal/path
提出请求
- (猜测)在我的节点池上设置
GKE_METADATA_SERVER
将其配置为解析到该节点上的gke-metadata-server
pod。 - (猜测)具有 --privileged 和主机网络的
gke-metadata-server
pod 有一种确定源(pod IP?)然后查找 pod 及其服务帐户以检查iam.gke.io/gcp-service-account
注解. - (猜测)代理使用 pods 'pseudo' 身份集(例如
[PROJECT_ID].svc.id.goog[[K8S_NAMESPACE]/[KSA_NAME]]
)调用元数据服务器,以获取在其 Kubernetes 服务帐户上注释的服务帐户的令牌. - 如果此帐户对服务帐户具有令牌创建者/工作负载 ID 用户权限,则可能来自 GCP 的响应是成功的并包含一个令牌,然后将其打包并设置回调用 pod 以对其他 Google APIs.
我想我现在的主要难题是验证调用 pods 身份。最初我认为这会使用 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 签名。
Google 云:接受访问令牌,几乎可以做任何事情。
JWT: JSON 网络令牌
mTLS:相互传输层安全
以下步骤解释了 GKE 元数据服务器组件的工作原理:
步骤 1:授权用户将集群绑定到命名空间。
步骤 2:工作负载尝试使用客户端库访问 Google 云服务。
步骤 3:GKE 元数据服务器将从控制平面请求 OIDC 签名的 JWT。该连接使用带有节点凭证的相互 TLS (mTLS) 连接进行身份验证。
第 4 步:然后 GKE 元数据服务器将使用 OIDC 签名的 JWT 为 [身份命名空间]/[Kubernetes 服务请求访问令牌来自 IAM 的帐户]。 IAM 将验证身份命名空间和 OIDC 提供商中是否存在适当的绑定。
第 5 步:然后 IAM 验证它是否由集群的正确 OIDC 提供商签名。然后它将 return [身份命名空间]/[kubernetes 服务帐户] 的访问令牌。
第6步:然后元数据服务器将它刚刚得到的访问令牌发送回IAM。然后,IAM 将在验证适当的绑定后将其交换为短期 GCP 服务帐户令牌。
第 7 步:然后 GKE 元数据服务器 return 将 GCP 服务帐户令牌发送给工作负载。
步骤 8:然后工作负载可以使用该令牌调用任何 Google 云服务。
我还找到了关于工作负载身份的 video,您会发现它很有用。
编辑后续问题的答案:
以下是您后续问题的答案:
Q1:在第 2 步和第 3 步之间,对 metadata.google.internal 的请求是否通过节点上的设置 GKE_METADATA_SERVER 路由到 gke 元数据代理游泳池?
你说得对,GKE_METADATA_SERVER是在节点池上设置的。这将元数据 API 公开给与 V1 计算元数据 API 兼容的工作负载。一旦工作负载尝试访问 Google 云服务,GKE 元数据服务器在继续请求之前执行查找(元数据服务器检查列表中是否存在 IP 与请求的传入 IP 匹配的 pod)来自控制平面的 OIDC 令牌。
请记住,只有在集群级别启用了 Workload Identity 才能启用 GKE_METADATA_SERVER 枚举功能。
Q2: 为什么metadata server pod需要host联网?
gke-metadata-server 拦截来自 pods 的所有 GCE 元数据服务器请求,但是 pods 使用主机网络不会被拦截。
Q3:GKE元数据服务器如何识别调用启动进程的pod?
使用 iptables 规则识别 pods。