如何将GKE连接至Google Object Storage?配置遇403权限问题求助
解决方案:必须配置工作负载身份联合
你的核心问题是没有启用工作负载身份联合(Workload Identity),导致Kubernetes应用实际使用的是GKE节点的默认服务账号,而非你绑定了IAM角色的Kubernetes服务账号。以下是具体排查和配置步骤:
1. 确认GKE集群已启用工作负载身份
检查你的Terraform集群配置,确保workload_identity_config.enabled设为true:
resource "google_container_cluster" "gke_cluster" { # 其他集群配置(名称、区域、节点池等) workload_identity_config { enabled = true } }
2. 创建并绑定GCP服务账号与Kubernetes服务账号
GKE的工作负载身份需要通过GCP服务账号作为中间层,将K8s服务账号的权限映射到GCP IAM:
- 首先创建一个GCP服务账号,为其赋予GCS桶的
roles/storage.objectAdmin角色 - 将K8s服务账号绑定到该GCP服务账号,赋予
roles/iam.workloadIdentityUser角色
Terraform配置示例:
# 创建GCP服务账号 resource "google_service_account" "gcs_admin_sa" { account_id = "gcs-admin-sa" display_name = "GCS Admin Service Account" } # 为GCP服务账号赋予GCS桶的Object Admin权限 resource "google_storage_bucket_iam_member" "gcs_bucket_admin" { bucket = google_storage_bucket.your_bucket.name role = "roles/storage.objectAdmin" member = "serviceAccount:${google_service_account.gcs_admin_sa.email}" } # 绑定K8s服务账号到GCP服务账号 resource "google_service_account_iam_member" "workload_binding" { service_account_id = google_service_account.gcs_admin_sa.name role = "roles/iam.workloadIdentityUser" # 格式:serviceAccount:[GCP项目ID].svc.id.goog[K8s命名空间/K8s服务账号名] member = "serviceAccount:${data.google_project.current.project_id}.svc.id.goog[your-namespace/your-k8s-sa]" }
3. 为Kubernetes服务账号添加注解
确保你的K8s服务账号包含iam.gke.io/gcp-service-account注解,指向对应的GCP服务账号邮箱:
resource "kubernetes_service_account" "your_k8s_sa" { metadata { name = "your-k8s-sa" namespace = "your-namespace" annotations = { "iam.gke.io/gcp-service-account" = google_service_account.gcs_admin_sa.email } } }
4. 验证应用配置
部署应用时,务必指定serviceAccountName为上述K8s服务账号:
# 示例Deployment片段 spec: template: spec: serviceAccountName: your-k8s-sa containers: - name: your-app image: ...
为什么之前能访问Artifact Registry?
你能读取Artifact Registry,大概率是因为GKE节点的默认服务账号本身拥有Artifact Registry的读取权限(比如默认的roles/storage.objectViewer或roles/artifactregistry.reader),而应用当时使用的是节点服务账号的权限,而非你配置的K8s服务账号权限。
内容的提问来源于stack exchange,提问作者Samaruman
相关产品推荐
相关产品推荐

