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

如何从Vault Secret在Kubernetes Deployment中设置环境变量

最优实现方式

根据你的场景,有两种主流实现方案,可按需选择:

方案一:直接通过容器启动命令读取挂载文件(无中间资源,推荐简单场景)

利用已有的CSI挂载目录,在容器启动时读取密钥文件内容并设置为环境变量,无需额外创建Kubernetes Secret资源:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: your-app
  template:
    metadata:
      labels:
        app: your-app
    spec:
      volumes:
      - name: secrets-store-inline
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "your-secret-provider-class-name" # 替换为你的SecretProviderClass名称
      containers:
      - name: your-app-container
        image: your-app-image:tag
        volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
        # 通过启动命令读取密钥文件并设置环境变量,再执行应用程序
        command: ["/bin/sh", "-c"]
        args:
        - |
          DB_PASSWORD=$(cat /mnt/secrets-store/test_secret)
          export DB_PASSWORD
          exec your-app-entrypoint-command # 替换为你的应用实际启动命令

方案二:同步为Kubernetes Secret后引用(适合多资源复用场景)

修改你的SecretProviderClass,添加secretObjects配置,将Vault中的密钥同步为Kubernetes Secret,之后在Deployment中直接引用该Secret作为环境变量:

1. 更新SecretProviderClass

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: your-secret-provider-class-name
spec:
  provider: vault
  parameters:
    vaultAddress: "http://vault.default.svc.cluster.local:8200"
    roleName: "your-vault-role"
    objects: |
      - objectName: "test_secret"
        secretPath: "path/to/your/vault/secret" # 替换为你的Vault密钥路径
        secretKey: "test_secret" # 替换为Vault密钥中的键名
  # 添加同步到Kubernetes Secret的配置
  secretObjects:
  - data:
    - key: DB_PASSWORD # 对应Kubernetes Secret中的键名
      objectName: test_secret # 对应上面objects中的objectName
    secretName: vault-synced-secret # 要创建的Kubernetes Secret名称
    type: Opaque

2. 在Deployment中引用同步后的Secret

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: your-app
  template:
    metadata:
      labels:
        app: your-app
    spec:
      containers:
      - name: your-app-container
        image: your-app-image:tag
        env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: vault-synced-secret # 对应上面SecretProviderClass中配置的secretName
              key: DB_PASSWORD # 对应上面secretObjects中的key

方案对比

  • 方案一:无需额外资源,配置简单,直接利用已有挂载,适合单Deployment使用密钥的场景;缺点是环境变量仅在容器启动时读取,若Vault密钥更新,需要重启容器才能生效。
  • 方案二:将密钥同步为Kubernetes Secret,可在多个Deployment、StatefulSet等资源中复用;若配置了自动同步(需开启CSI驱动的自动轮换特性),密钥更新后会自动同步到Kubernetes Secret,部分应用可通过监听Secret变化实现热更新;缺点是需要额外配置SecretProviderClass的同步规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:42:41