如何从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
相关产品推荐
相关产品推荐

