kubernetes GKE工作负载身份绑定到IAM非常慢(约1分钟)

hivapdat  于 2023-03-07  发布在  Kubernetes
关注(0)|答案(1)|浏览(201)

我正在使用Workload Identity with GKE,这样一个命名空间的pod就可以访问GCP资源。我注意到IAM和GKE帐户之间的绑定需要大约1分钟,这对我的应用程序来说太慢了。

curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
# => myapp@myproject.iam.gserviceaccount.com

# Bind GKE service account to IAM service account
gcloud iam service-accounts add-iam-policy-binding \
      myapp@myproject.iam.gserviceaccount.com \
      --member "myproject.svc.id.goog[user-1/myapp]" \
      --role roles/iam.workloadIdentityUser

# ... Takes 1min of 403 until I can actually access the GCP resource

这是正常的行为吗?有什么替代方案可以立即访问一个吊舱?

bakd9h0s

bakd9h0s1#

是的,这很正常。
Google Cloud IAM有各种缓存层,这意味着access change propagation需要时间才能完成,这使得应用IAM更改“最终一致”。
此外,使用工作负载标识的元数据服务器对于Pod可用的时间有几秒钟的已知限制:
GKE元数据服务器需要几秒钟才能开始接受新建Pod上的请求。因此,在Pod生命周期的前几秒钟内尝试使用工作负载标识进行身份验证可能会失败。重试调用将解决该问题。有关详细信息,请参阅疑难解答。
你可以在你的pod中使用一个init container来确认元数据服务器在你的主应用容器启动之前运行正常(例如curl -H 'Metadata-Flavor:google' http://metadata.google.internal/computeMetadata/v1 ...),这样当你的应用代码开始运行时一切都准备就绪了。
有什么替代方案可以立即访问Pod?
这取决于您的应用程序需求。为什么每个Pod都需要一个新的服务帐户?一些替代方法包括:

  • 使用预先存在的服务帐户池并循环其权限和pod使用(例如,从pod中删除、应用任何更改、在下一个pod上使用)
  • 通过Kubernetes Secrets挂载传递API密钥或其他所需值
  • 为您的服务帐户创建并使用short lived access IAM tokens

相关问题