You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:32:24