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

无法从Google Secret Manager为GKE添加TLS证书的问题求助

问题修复方案

第一个错误:CSI卷挂载YAML解析失败

错误原因

  1. Deployment中volumeMounts指定的卷名ispsecret和volumes定义的卷名testsecret不匹配
  2. SecretProviderClass里parameters.secrets的YAML缩进错误,fileName未与resourceName对齐,且$PROJECT_ID未替换为实际GCP项目ID

修复步骤

  1. 修正Deployment的卷名称匹配:
    volumeMounts:
    - name: testsecret  # 替换原ispsecret,与volumes中的名称一致
      mountPath: /var/secret
    
  2. 修正SecretProviderClass的缩进并替换项目ID:
    parameters:
      secrets: |
        - resourceName: "projects/你的GCP项目ID/secrets/test_ssl_secret/versions/latest"
          fileName: "testcert.pem"  # 缩进与resourceName对齐
    

第二个错误:Ingress找不到test-tls-csi Secret

错误原因

  1. SecretProviderClass的secretObjects配置错误:同一个testcert.pem同时映射到tls.key和tls.crt,无法正确拆分私钥与证书内容,导致无法生成有效TLS Secret
  2. 应用使用的ServiceAccount缺少访问GCP Secret Manager的权限
  3. 可能未正确部署GCP Secrets Store CSI驱动组件

修复步骤

步骤1:拆分证书存储或调整CSI提取规则

最可靠的方式是将私钥和证书分别存入Secret Manager的两个独立Secret:

  • 将私钥存入test_ssl_private_key
  • 将证书存入test_ssl_certificate

然后修改SecretProviderClass:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test-tls
spec:
  provider: gcp
  secretObjects:
  - secretName: test-tls-csi
    type: kubernetes.io/tls
    data: 
    - objectName: "test_ssl_private_key"
      key: tls.key
    - objectName: "test_ssl_certificate"
      key: tls.crt
  parameters:
    secrets: |
      - resourceName: "projects/你的GCP项目ID/secrets/test_ssl_private_key/versions/latest"
        fileName: "tls.key"
      - resourceName: "projects/你的GCP项目ID/secrets/test_ssl_certificate/versions/latest"
        fileName: "tls.crt"

若坚持使用单个Secret文件,可通过jmesPath提取对应内容(依赖文件格式严格):

secretObjects:
- secretName: test-tls-csi
  type: kubernetes.io/tls
  data:
  - objectName: testcert.pem
    key: tls.key
    jmesPath: "split('\n-----END PRIVATE KEY-----', @)[0] + '\n-----END PRIVATE KEY-----'"
  - objectName: testcert.pem
    key: tls.crt
    jmesPath: "split('-----BEGIN CERTIFICATE-----', @)[1] | split('\n-----END CERTIFICATE-----', @)[0] | '-----BEGIN CERTIFICATE-----' + '\n' + @ + '\n-----END CERTIFICATE-----'"

步骤2:授予ServiceAccount权限

为应用使用的ServiceAccount添加Secret Manager访问权限:

gcloud projects add-iam-policy-binding 你的GCP项目ID \
  --member "serviceAccount:你的SA邮箱" \
  --role "roles/secretmanager.secretAccessor"

SA邮箱格式:SA名称@项目ID.iam.gserviceaccount.com

步骤3:验证CSI驱动部署

检查GKE集群中是否已部署CSI驱动组件:

kubectl get pods -n kube-system | grep secrets-store

若未部署,执行以下命令安装:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/secrets-store-csi-driver/main/deploy/rbac-secretproviderclass.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/secrets-store-csi-driver/main/deploy/csidriver.yaml
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp/main/deploy/provider-gcp-plugin.yaml

步骤4:验证Secret生成

重新部署后检查Secret是否存在:

kubectl get secret test-tls-csi -n 你的命名空间

若Secret存在,Ingress即可正常读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:53:25