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

时间:2019-11-01 20:03:48

标签: kubernetes google-cloud-platform google-kubernetes-engine google-iam

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

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

我想现在对我来说,主要难题是验证呼叫者身份。最初我以为这会使用TokenReview API,但现在我不确定Google客户端工具如何知道如何使用安装在Pod中的服务帐户令牌...

编辑后续问题:

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

第二季度:为什么元数据服务器容器需要主机联网?

Q3:在此处的视频https://youtu.be/s4NYEJDFc0M?t=2243中,假设吊舱进行了GCP通话。 GKE元数据服务器如何识别发出呼叫的吊舱以开始流程?

1 个答案:

答案 0 :(得分:3)

在进入细节之前,请熟悉以下组件:

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

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

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

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

JWT :JSON Web令牌

mTLS :相互传输层安全性

以下步骤说明了GKE元数据服务器组件如何工作:

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

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

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

步骤4 :然后,GKE元数据服务器将使用OIDC签名的JWT向来自 [身份名称空间] / [Kubernetes服务帐户] 的访问令牌请求访问令牌我是。 IAM将验证身份名称空间和OIDC提供程序中是否存在适当的绑定。

第5步:然后IAM验证它是否由集群的正确OIDC提供者签名。然后它将返回 [身份名称空间] / [kubernetes服务帐户]的访问令牌。

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

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

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

我还发现了一个关于工作负载身份的video,您会发现它很有用。

EDIT 后续问题的答案:

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

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

是的,在节点池上设置了GKE_METADATA_SERVER。这会将元数据API公开给与V1计算元数据API兼容的工作负载。一旦工作负载尝试访问Google Cloud服务,GKE元数据服务器就会继续进行查找(元数据服务器检查列表中是否存在一个Pod,其IP与请求的传入IP相匹配),然后继续向其请求OIDC令牌控制平面。

请记住,GKE_METADATA_SERVER枚举功能只有在集群级别启用了工作负载标识的情况下才能启用。

第二季度:为什么元数据服务器容器需要主机联网?

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

第3季度:GKE元数据服务器如何识别发出呼叫以开始流程的Pod?

使用iptables规则来识别Pod。