当前位置: 首页 > 知识库问答 >
问题:

具有工作负载标识的谷歌云Java SDK?

廉高邈
2023-03-14

试图找出如何从GKE集群中使用存储API进行身份验证。

代码:

Storage storage = StorageOptions.newBuilder()
  .setCredentials(ServiceAccountCredentials.getApplicationDefault())
  .setProjectId(gcpProjectId)
  .build().getService();

getApplicationDefault()被记录为使用以下方法通过API进行身份验证:

  1. {@code GOOGLE_APPLICATION_Credentials}环境变量指向的凭据文件

应用程序正在使用GCP工作负载标识功能,因此应用程序(群集内)服务号注释为:

serviceAccount.annotations.iam.gke.io/gcp-service-account: my-service-account@my-project.iam.gserviceaccount.com

现在,调用存储帐户失败,出现以下错误:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object.",
    "reason" : "forbidden"
  } ],
  "message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object."
}

这让我觉得工作负载标识工作不正常。我希望收到带注释的服务帐户的错误消息,而不是默认的。

还有什么我应该做的吗?

共有2个答案

壤驷德寿
2023-03-14

注释错误。而不是:

serviceAccount.annotations.iam.gke.io/gcp-service-account: my-service-account@my-project.iam.gserviceaccount.com

它一定是

iam.gke.io/gcp-service-account: my-service-account@my-project.iam.gserviceaccount.com

现在,错误消息还显示应用程序正在使用工作负载标识:

java.io.IOException: Unexpected Error code 403 trying to get security access token from Compute Engine metadata for the default service account: Unable to generate access token; IAM returned 403 Forbidden: The caller does not have permission
This error could be caused by a missing IAM policy binding on the target IAM service account.
For more information, refer to the Workload Identity documentation:
    https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#creating_a_relationship_between_ksas_and_gsas
宰父深
2023-03-14

除了注释语法之外,部分答案是,就像我一样,你可能没有仔细研究留档中的这部分:

    gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]" \
  GSA_NAME@PROJECT_ID.iam.gserviceaccount.com

注意PROJECT_ID.svc。id.goog[K8S_名称空间/KSA_名称]piece。他们没有给出语法方面的例子,但在我的terraform中是这样的。

resource "google_project_iam_member" "app-binding-2" {
  role   = "roles/iam.workloadIdentityUser"
  member = "serviceAccount:${local.ws_vars["project-id"]}.svc.id.goog[mynamespace/myk8ssaname]"
}

奇怪的是,我不知道你可以将IAM策略绑定到k8s服务帐户,更奇怪的是,你可以在terraform中绑定它,即使名称空间不存在,更不用说服务帐户了。所以你可以在部署之前先运行这个。

我真的希望谷歌能提供更好的文档和支持,我花了几个小时才弄明白。

 类似资料:
  • 我试图在Composer 2环境中运行GKEStartPodOperator/KubernetesPodOperator任务,该环境在自动驾驶模式下使用GKE集群。我们有一个现有的Composer 1环境,GKE集群不处于自动驾驶模式。我们使用谷歌云平台服务(BigQuery、GCS等)进行身份验证的任务在Composer 2环境中失败,但在Composer 1环境中成功。 在日志文件中,我可以看

  • Google docu表示,工作负载标识可以用来授权GKE POD使用Google API提供的服务(而且效果很好)。它还表示,将有一个自动创建的标识池,名为PROJECT\u ID.svc。id.goog。 关于工作负载标识联合的Docu说:“您可以使用工作负载标识池来组织和管理外部标识。” 在我按照这里所述配置了工作负载标识(并且工作正常)之后,我正在尝试检索项目中现有的工作负载标识池,我希望

  • 我创建了一个java应用程序,并将其部署到Google云计算引擎中,然后创建了一个负载平衡器,但当我尝试使用端口443访问负载平衡器前端IP时,它会重定向到端口80

  • 我遵循谷歌云平台的指南,通过使用云SQL代理和公共IP地址的GKE集群连接到云SQL实例(https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine).但是,在尝试部署应用程序后,我在容器日志中出现以下错误。 然后是错误信息 此外(我假设是相关的),当我检查集群中节点的计算引擎时,我看到Cloud SQL Cloud A

  • 我们已经为一个基于Java/Tomcat的应用程序设置了一个CloudSQL代理作为侧车容器。 下面是我们如何设置工作负载标识,以使我们的应用程序能够通过CloudSQL代理连接到CloudSQL: > 创建了云IAM服务帐户并授予其SQL客户端权限: 设置策略绑定如下: 向GKE服务帐户添加注释: 但当我们使用以下方法进行测试时: 尽管按照本页所述正确执行了所有操作,但仍然会导致:

  • 有人知道如果有任何其他方式的认证/授权访问谷歌云存储除了服务帐户密钥,当我使用@谷歌云/存储Node.js模块从这里?我读过关于“工作负载标识联合”的文章,但是在我看来,当我使用@google-Cloud/存储库时,我不能使用这种方法。我找不到任何合适的构造函数,只有这两个: 有什么建议吗?谢谢你们