从Google Secret Manager读取JSON密钥并转为Pod环境变量
解决方案:将GCP Secret Manager的JSON密钥转为Kubernetes Pod环境变量
方法1:使用GCP Secret Store CSI Driver(生产环境推荐)
这是Kubernetes与GCP原生集成的方案,无需手动中转密钥,支持自动同步Secret Manager的密钥更新。
步骤1:启用CSI Driver(GKE集群)
通过GCloud命令为集群开启Secret Store CSI Driver插件:
gcloud container clusters update YOUR_CLUSTER_NAME --update-addons=GcpSecretManagerCSIProvider=ENABLED
步骤2:创建SecretProviderClass资源
该资源定义从Secret Manager拉取的密钥,并用JMESPATH提取JSON中的指定键值(和你在AWS的用法一致):
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: gcp-json-secret spec: provider: gcp parameters: secrets: | - resourceName: "projects/YOUR_PROJECT_ID/secrets/YOUR_SECRET_NAME/versions/latest" path: "secret.json" # 密钥挂载到Pod内的文件名 secretObjects: - secretName: k8s-env-secret type: Opaque data: - key: value-A # Kubernetes Secret中的键名 objectName: secret.json jmesPath: "value-A" # JMESPATH表达式提取对应值 - key: value-B objectName: secret.json jmesPath: "value-B"
替换YOUR_PROJECT_ID和YOUR_SECRET_NAME为你的实际信息。
步骤3:在Pod中引用环境变量
在Pod配置里直接引用生成的Kubernetes Secret,将键值转为环境变量:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: nginx env: - name: value-A valueFrom: secretKeyRef: name: k8s-env-secret key: value-A - name: value-B valueFrom: secretKeyRef: name: k8s-env-secret key: value-B volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "gcp-json-secret"
Pod启动后即可通过${value-A}和${value-B}读取对应值。
方法2:手动中转(测试/临时场景)
如果不需要自动同步,可手动导出密钥并创建Kubernetes Secret:
步骤1:从Secret Manager导出JSON密钥
gcloud secrets versions access latest --secret=YOUR_SECRET_NAME > secret.json
步骤2:创建Kubernetes Secret
用jq解析JSON,提取键值对生成Secret:
kubectl create secret generic k8s-env-secret \ --from-literal=value-A=$(jq -r '.["value-A"]' secret.json) \ --from-literal=value-B=$(jq -r '.["value-B"]' secret.json)
步骤3:在Pod中引用环境变量
和方法1的步骤3完全一致,直接在Pod的env字段引用k8s-env-secret的键即可。
关键注意事项
- 确保集群节点服务账号拥有
roles/secretmanager.secretAccessor权限,否则无法拉取Secret Manager密钥。 - JSON中的特殊字符键(如带连字符的
value-A)可直接作为环境变量名,Kubernetes支持此类命名。
内容的提问来源于stack exchange,提问作者Muneeshpandi
相关产品推荐
相关产品推荐

