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

GKE部署K8s处理器:ExternalSecret配置失败与Secret缺失问题解决

解决GKE集群中从GCP Secrets Manager同步Secret到K8s的问题

1. 问题根源

你使用的ExternalSecret资源apiVersion错误(kubernetes-client.io/v1并非官方External Secrets Operator的正确版本),且GKE集群未部署External Secrets Operator (ESO)——K8s原生不支持ExternalSecret资源,必须通过该组件实现与GCP Secrets Manager的同步。这两个问题导致K8s无法识别ExternalSecret配置,进而无法将GCP侧的Secret同步到集群内,最终Pod因找不到指定Secret启动失败。

2. 步骤1:部署External Secrets Operator (ESO)

ESO是实现K8s与GCP Secrets Manager同步的核心组件,先安装到集群:

方法A:用Helm安装(推荐)

# 添加ESO Helm仓库
helm repo add external-secrets https://charts.external-secrets.io
# 更新仓库索引
helm repo update
# 安装ESO到external-secrets命名空间
helm install external-secrets external-secrets/external-secrets \
    -n external-secrets \
    --create-namespace \
    --set installCRDs=true

方法B:用kubectl安装

kubectl apply -f https://github.com/external-secrets/external-secrets/releases/latest/download/external-secrets.yaml

验证安装成功:

kubectl get pods -n external-secrets

看到所有Pod处于Running状态即可。

3. 步骤2:配置ESO的GCP访问权限

ESO需要权限访问GCP Secrets Manager,推荐使用Workload Identity(GKE原生安全方案):

  1. 创建GCP服务账号(GSA)并授予Secrets Manager访问权限:
# 创建GSA
gcloud iam service-accounts create eso-gcp-access
# 授予读取Secrets Manager的权限
gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT_ID \
    --member="serviceAccount:eso-gcp-access@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/secretmanager.secretAccessor"
  1. 绑定GKE的K8s服务账号(KSA)与上述GSA:
# 为ESO创建KSA(如果不存在)
kubectl create serviceaccount eso-ksa -n external-secrets
# 绑定KSA和GSA
gcloud iam service-accounts add-iam-policy-binding eso-gcp-access@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com \
    --member="serviceAccount:YOUR_GCP_PROJECT_ID.svc.id.goog[external-secrets/eso-ksa]" \
    --role="roles/iam.workloadIdentityUser"
# 给KSA添加注解,关联GSA
kubectl annotate serviceaccount eso-ksa -n external-secrets \
    iam.gke.io/gcp-service-account=eso-gcp-access@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com
  1. 更新ESO的Deployment,使用上述KSA:
kubectl patch deployment external-secrets -n external-secrets \
    --patch '{"spec":{"template":{"spec":{"serviceAccountName":"eso-ksa"}}}}'

4. 步骤3:修正ExternalSecret配置

将原deployment.yaml中的ExternalSecret部分替换为正确配置(注意apiVersion和字段):

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: dbt-test-secret-sync
  namespace: YOUR_NAMESPACE # 替换为你的Deployment所在命名空间
spec:
  secretStoreRef:
    name: gcp-secrets-manager
    kind: ClusterSecretStore
  target:
    name: service-account-credentials-dbt-test # 要生成的K8s Secret名称,需与Deployment中引用的一致
  data:
  - secretKey: credentials.json # K8s Secret中的键名
    remoteRef:
      key: YOUR_GCP_SECRET_NAME # GCP Secrets Manager中的Secret名称
      version: latest # 可选,指定Secret版本

同时创建ClusterSecretStore,让ESO知道连接到GCP Secrets Manager:

apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: gcp-secrets-manager
spec:
  provider:
    gcpsm:
      projectID: YOUR_GCP_PROJECT_ID # 替换为你的GCP项目ID
      auth:
        workloadIdentity: {} # 使用Workload Identity认证

5. 步骤4:重新部署并验证

  1. 先应用ClusterSecretStore和修正后的配置:
kubectl apply -f cluster-secret-store.yaml
kubectl apply -f your-updated-deployment.yaml
  1. 验证K8s Secret是否生成:
kubectl get secret service-account-credentials-dbt-test -n YOUR_NAMESPACE

能看到该Secret说明同步成功。

  1. 查看Pod状态:
kubectl get pods -n YOUR_NAMESPACE

此时Pod应能正常启动,不再报secret not found错误。

可选:非Workload Identity方式(不推荐)

若暂时无法使用Workload Identity,可通过GSA密钥文件挂载实现认证(安全性较低):

  1. 下载GSA密钥文件:
gcloud iam service-accounts keys create key.json \
    --iam-account=eso-gcp-access@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com
  1. 创建K8s Secret存储该密钥:
kubectl create secret generic gcpsm-secret -n external-secrets \
    --from-file=credentials.json=key.json
  1. 修改ClusterSecretStore的认证方式:
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: gcp-secrets-manager
spec:
  provider:
    gcpsm:
      projectID: YOUR_GCP_PROJECT_ID
      auth:
        secretRef:
          secretAccessKeySecretRef:
            name: gcpsm-secret
            key: credentials.json
            namespace: external-secrets

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:35:48