无法从Google Secret Manager为GKE添加TLS证书的问题求助
问题修复方案
第一个错误:CSI卷挂载YAML解析失败
错误原因
- Deployment中
volumeMounts指定的卷名ispsecret和volumes定义的卷名testsecret不匹配 - SecretProviderClass里
parameters.secrets的YAML缩进错误,fileName未与resourceName对齐,且$PROJECT_ID未替换为实际GCP项目ID
修复步骤
- 修正Deployment的卷名称匹配:
volumeMounts: - name: testsecret # 替换原ispsecret,与volumes中的名称一致 mountPath: /var/secret - 修正SecretProviderClass的缩进并替换项目ID:
parameters: secrets: | - resourceName: "projects/你的GCP项目ID/secrets/test_ssl_secret/versions/latest" fileName: "testcert.pem" # 缩进与resourceName对齐
第二个错误:Ingress找不到test-tls-csi Secret
错误原因
- SecretProviderClass的
secretObjects配置错误:同一个testcert.pem同时映射到tls.key和tls.crt,无法正确拆分私钥与证书内容,导致无法生成有效TLS Secret - 应用使用的ServiceAccount缺少访问GCP Secret Manager的权限
- 可能未正确部署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
相关产品推荐
相关产品推荐

