从Autopilot GKE集群访问Google Cloud Storage



我从自动驾驶GKE集群查询谷歌云存储有问题。以前,当集群是标准的时候,我没有任何问题(只要集群是用:——scopes " https://www.googleapis.com/auth/cloud-platform "创建的)。

现在我需要使用自动驾驶仪集群而不是标准,我在GKE集群上得到的错误是这样的:

google.api_core.exceptions。禁止:403 GET https://storage.googleapis.com/storage/v1/b/my-bucket?projection=noAcl&prettyPrint=false:调用者没有Storage .buckets. GET访问Google Cloud Storage bucket的权限。"storage.buckets许可。

资源被拒绝(或者可能不存在)。

在scope之外,我关联了一个可以查询GCS和BQ的服务账号。我已经在一个计算引擎VM中使用了相同的服务帐户,没有任何问题。但是在Autopilot集群上,我一直有这个问题。

谁有什么建议?

Autopilot集群始终启用Workload Identity以从您的pod访问其他Google Cloud服务。所以你需要:

  1. 在您部署气流的命名空间中创建Kubernetes服务帐户
kubectl create serviceaccount $KSA_NAME -n $NS

(替换$KSA_NAME和$NS)

  1. 在项目中创建IAM服务帐户:
gcloud iam service-accounts create $GSA_NAME 
--project=$PROJECT_ID

(替换$GSA_NAME和$PROJECT_ID)

  1. 将IAM服务帐户绑定到访问存储桶所需的角色:
gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME 
--member "serviceAccount:$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com" 
--role=objectViewer

(将$BUCKET_NAME替换为您的桶,如果您需要桶上的get以上,您可以使用不同的角色)

  1. 允许Kubernetes服务帐户模拟GSA:
gcloud iam service-accounts add-iam-policy-binding $GSA_ NAME@$PROJECT_ID.iam.gserviceaccount.com 
--role roles/iam.workloadIdentityUser 
--member "serviceAccount:PROJECT_ID.svc.id.goog[$NS/$KSA_NAME]"
  1. 注释您的Kubernetes服务帐户
kubectl annotate serviceaccount $KSA_NAME 
--namespace $ns 
iam.gke.io/gcp-service-account=$GSA_ NAME@$PROJECT_ID.iam.gserviceaccount.com
  1. 在您的部署规范中使用GSA:
...
spec:
serviceAccountName: $KSA_NAME
...

详细信息请参见配置应用程序以使用工作负载标识。