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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:03:30