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

GKE结合External Secrets访问Secret Manager遇404错误排查

问题

在将GKE标准集群中的密钥管理迁移至Secret Manager+External Secrets Operator时,遇到以下错误:

failed to create GCP secretmanager client: unable to fetch identitybindingtoken: could not get idbindtoken token, status: 404

怀疑GKE与工作负载身份服务账号的绑定存在问题,但不确定是集群本身还是其他环节的问题。

提供的配置

Terraform配置

resource "google_service_account" "external_secret_sa" {
  account_id  = "external-secrets-sa"
  description = "Service Account for external secrets"
  project     = var.project_id
}

# Gives the external secrets Service account access to token creator
resource "google_project_iam_binding" "external_secret_sa_token_creator" {
  project = var.project_id
  role    = "roles/iam.serviceAccountTokenCreator"
  members = [
    "serviceAccount:${google_service_account.external_secret_sa.email}"
  ]
}
# Gives the external secrets Service account access to the secret manager. 
resource "google_project_iam_binding" "external_secret_sa_access" {
  project = var.project_id
  role    = "roles/secretmanager.secretAccessor"
  members = [
    "serviceAccount:${google_service_account.external_secret_sa.email}"
  ]
}

#Allow kubernetes service account to impersonate GCP service account
resource "google_service_account_iam_binding" "external_secret_sa_bind" {
  service_account_id = google_service_account.external_secret_sa.name
  role               = "roles/iam.workloadIdentityUser"

  members = [
    "serviceAccount:${var.project_id}.svc.id.goog[external-secrets/${google_service_account.external_secret_sa.account_id}]
  ]
  depends_on = [google_service_account.external_secret_sa]
}

External Secrets Helm配置

external-secrets:
  installCRDs: true
  serviceAccount:
    create: true
    name: external-secrets-sa
    annotations:
      iam.gke.io/gcp-service-account: "external-secrets-sa@myproject.iam.gserviceaccount.com"

ClusterSecretStore配置

apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: gcp-secret-store
spec:
  provider:
    gcpsm:
      projectID: {{ .Values.projectId }}
      auth:
        workloadIdentity:
          # name of the cluster Location, region or zone
          clusterLocation: {{ .Values.region }}
          # name of the GKE cluster
          clusterName: {{ .Values.gkeCluster }}
          # reference the sa from above
          serviceAccountRef:
            name: {{ index .Values "external-secrets" "serviceAccount" "name" }}
            namespace: {{ .Release.Namespace }}

GKE节点池OAuth范围

node_pools_oauth_scopes = {
    all = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
      "https://www.googleapis.com/auth/devstorage.read_only",
      "https://www.googleapis.com/auth/cloud-platform"

    ]
  }
错误原因及排查步骤

核心原因

这个404错误通常是工作负载身份绑定的某个环节不匹配导致的——K8s服务账号无法正确获取GCP服务账号的身份绑定令牌,常见问题点包括绑定关系的命名空间/账号名不匹配、权限配置缺失、集群信息错误等。

排查步骤

1. 检查工作负载身份绑定的成员格式

Terraform中google_service_account_iam_binding的成员格式必须严格遵循:serviceAccount:<PROJECT_ID>.svc.id.goog[NAMESPACE/KUBERNETES_SA_NAME]

  • 确认配置里的命名空间是external-secrets(和Helm部署ESO的命名空间一致,若部署在其他命名空间需对应修改)
  • 确认K8s服务账号名称是external-secrets-sa(和Helm配置的serviceAccount.name一致)
  • 检查是否存在语法错误:你的配置中成员字符串末尾缺少闭合引号,需修正为:
    "serviceAccount:${var.project_id}.svc.id.goog[external-secrets/${google_service_account.external_secret_sa.account_id}]"
    

2. 验证GCP与K8s服务账号的绑定关系

执行以下命令检查绑定是否生效:

gcloud iam service-accounts get-iam-policy external-secrets-sa@<你的PROJECT_ID>.iam.gserviceaccount.com

查看输出中是否包含roles/iam.workloadIdentityUser角色,且成员是正确的K8s服务账号格式。若没有,说明Terraform绑定未正确应用:

  • 检查Terraform是否执行成功
  • 注意iam_binding会替换角色下的所有成员,若之前有其他成员,需改用iam_member来追加绑定

3. 修正Helm配置中的服务账号注解

Helm配置里的iam.gke.io/gcp-service-account注解必须和GCP服务账号邮箱完全一致:

  • 替换硬编码的myproject为实际项目ID,确保注解值为external-secrets-sa@<你的PROJECT_ID>.iam.gserviceaccount.com
  • 执行命令验证K8s服务账号的注解:
    kubectl get sa external-secrets-sa -n external-secrets -o yaml
    
    确认注解存在且正确。

4. 检查ClusterSecretStore的集群信息配置

  • clusterLocation需匹配集群类型:区域集群填区域名(如us-central1),Zonal集群填完整Zone名(如us-central1-a),填错会导致无法定位集群返回404
  • 确认clusterName是GKE集群的正确名称,projectID为实际项目ID
  • 核对serviceAccountRef.namespace是否和Helm部署的命名空间一致

5. 确认GKE集群已启用工作负载身份

执行命令检查集群配置:

gcloud container clusters describe <CLUSTER_NAME> --location <CLUSTER_LOCATION> | grep workloadIdentityConfig

若输出无workloadIdentityConfig或workloadPool未设置,需启用工作负载身份:

gcloud container clusters update <CLUSTER_NAME> --location <CLUSTER_LOCATION> --workload-pool=<PROJECT_ID>.svc.id.goog

6. 查看ESO日志获取详细错误

获取ESO Pod日志,排查更具体的问题:

kubectl logs -n external-secrets deployment/external-secrets

日志中可能会提示集群名称错误、服务账号不存在等具体信息。


内容的提问来源于stack exchange,提问作者Steven Marks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:46:03