java - 具有工作负载身份的 Google Cloud Java SDK?

标签 java spring kubernetes google-cloud-platform google-kubernetes-engine

试图弄清楚如何从 GKE 集群中使用存储 API 进行身份验证。
代码:

Storage storage = StorageOptions.newBuilder()
  .setCredentials(ServiceAccountCredentials.getApplicationDefault())
  .setProjectId(gcpProjectId)
  .build().getService();
getApplicationDefault()已记录使用这些方法通过 API 进行身份验证:
  • {@code GOOGLE_APPLICATION_CREDENTIALS} 环境变量
  • 指向的凭据文件
  • Google Cloud SDK {@code gcloud auth application-default login} 命令
  • 提供的凭据
  • Google App Engine 内置凭据
  • Google Cloud Shell 内置凭据
  • Google Compute Engine 内置凭据

  • 该应用程序正在使用 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."
    }
    
    这让我认为工作负载身份无法正常工作。我希望收到我带注释的服务帐户的错误消息,而不是默认的。
    还有什么我应该做的吗?

    最佳答案

    除了注释语法之外,部分答案是,就像我一样,您可能没有仔细查看文档中的这一部分:

        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_NAMESPACE/KSA_NAME]片。就语法而言,他们没有给出任何示例,但在我的 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 策略绑定(bind)到 k8s 服务帐户,更奇怪的是,即使命名空间不存在,您也可以将其绑定(bind)到 terraform 中,更不用说服务帐户了。因此,您可以在部署之前先运行它。
    我真的希望谷歌能提供更好的文档和支持,这花了我几个小时才弄清楚。

    关于java - 具有工作负载身份的 Google Cloud Java SDK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64260222/

    相关文章:

    java - Apache PDFBox 和 CodenameOne 桌面应用程序

    java - hibernate 检索查询不起作用

    java - Spring MVC 重定向是在 url 中添加一些参数

    java - 在 Eclipse 中创建类似于 Spring Petclinic 的项目结构

    Java设计问题

    kubernetes - 如何等到分配 EXTERNAL-IP?

    dns - 对kube-dns pod进行故障排除:WAITING初始化的超时

    java - 为什么 String.intern() 方法会返回两个不同的结果?

    java - 谁来设置 JAXWS 2.2 客户端超时

    kubernetes - 如何让我的 kubernetes 获取最新的 docker 镜像?