如何在Kubernetes Deployment中用secrets-init读取Google Secret Manager密钥
基于secrets-init从Google Secret Manager注入密钥的Deployment示例
前提准备
- 确保Kubernetes中的
my-app服务账号已绑定Google Cloud的roles/secretmanager.secretAccessor角色,拥有读取目标密钥的权限 - 已在Google Secret Manager中创建对应密钥(示例中用
db-user和db-pass代指存储DB_USER、DB_PASS的密钥,可根据实际名称调整)
修改后的完整Deployment YAML
--- apiVersion: apps/v1 kind: Deployment metadata: name: my-app labels: name: my-app spec: selector: matchLabels: name: "my-app" template: metadata: labels: name: "my-app" version: "1.0.0" spec: serviceAccountName: my-app # 添加共享卷,传递init容器生成的密钥环境变量文件 volumes: - name: secrets-volume emptyDir: {} initContainers: - name: secrets-init image: ghcr.io/doitintl/secrets-init:0.4.7 # 配置从GSM拉取的密钥,格式为 SECRETS_INIT_GSM_SECRET_<环境变量名>=<GCP项目ID>/secrets/<密钥名>/versions/latest env: - name: SECRETS_INIT_GSM_SECRET_DB_USER value: "你的GCP项目ID/secrets/db-user/versions/latest" - name: SECRETS_INIT_GSM_SECRET_DB_PASS value: "你的GCP项目ID/secrets/db-pass/versions/latest" # 指定环境变量文件输出路径 - name: SECRETS_INIT_OUTPUT value: "/secrets/env.sh" volumeMounts: - name: secrets-volume mountPath: /secrets command: ["secrets-init"] containers: - name: "my-app" env: # 无需从GSM拉取的变量保持原有配置 - name: DB_NAME value: postgres image: "my-app:1.0.0" volumeMounts: - name: secrets-volume mountPath: /secrets # 先加载密钥环境变量,再启动应用(替换为你的应用实际启动命令) command: ["/bin/sh", "-c"] args: - | set -a . /secrets/env.sh set +a exec <你的应用启动命令>
关键修改说明
- 共享卷:新增
emptyDir类型的secrets-volume,用于在init容器与主容器之间传递密钥环境变量文件 - Init容器:
- 用
secrets-init镜像拉取GSM密钥,通过SECRETS_INIT_GSM_SECRET_*系列变量指定密钥的GCP资源路径 - 通过
SECRETS_INIT_OUTPUT定义将密钥导出为环境变量脚本的路径
- 用
- 主容器:
- 挂载共享卷读取密钥脚本,修改启动命令先加载脚本中的环境变量,再启动业务应用
简洁替代方案(直接用secrets-init作为入口点)
如果不想调整主容器启动逻辑,可将secrets-init设为主容器入口点,拉取密钥后直接启动应用:
# 主容器部分修改 containers: - name: "my-app" env: - name: DB_NAME value: postgres - name: SECRETS_INIT_GSM_SECRET_DB_USER value: "你的GCP项目ID/secrets/db-user/versions/latest" - name: SECRETS_INIT_GSM_SECRET_DB_PASS value: "你的GCP项目ID/secrets/db-pass/versions/latest" image: "my-app:1.0.0" # 用secrets-init拉取密钥后,直接启动应用 command: ["secrets-init"] args: ["<你的应用启动命令>"]
该方式无需额外卷和init容器,但需确保业务镜像与secrets-init二进制兼容(通常静态编译的secrets-init可适配大多数镜像)
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

