簡體   English   中英

帶有工作負載身份的 Google Cloud Java SDK?

[英]Google Cloud Java SDK with Workload Identity?

試圖弄清楚如何從 GKE 集群內使用存儲 API 進行身份驗證。

代碼:

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

getApplicationDefault()被記錄為使用這些方法與 API 進行身份驗證:

  1. {@code GOOGLE_APPLICATION_CREDENTIALS} 環境變量指向的憑據文件
  2. Google Cloud SDK {@code gcloud auth application-default login} 命令提供的憑據
  3. Google App Engine 內置憑據
  4. Google Cloud Shell 內置憑據
  5. 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 策略綁定到 k8s 服務帳戶,更奇怪的是,即使命名空間不存在,您也可以在 terraform 中綁定它,更不用說服務帳戶了。 所以你可以在部署之前先運行它。

我真的希望谷歌能提供更好的文檔和支持,這花了我幾個小時才弄明白。

試圖弄清楚如何從 GKE 集群內使用存儲 API 進行身份驗證。

代碼:

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

getApplicationDefault()被記錄為使用這些方法與 API 進行身份驗證:

  1. {@code GOOGLE_APPLICATION_CREDENTIALS} 環境變量指向的憑據文件
  2. Google Cloud SDK {@code gcloud auth application-default login} 命令提供的憑據
  3. Google App Engine 內置憑據
  4. Google Cloud Shell 內置憑據
  5. 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."
}

這讓我認為工作負載標識無法正常工作。 我希望收到有關我的帶注釋的服務帳戶的錯誤消息,而不是默認的。

還有什么我應該做的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM