如何在Helm中调用HashiCorp Vault存储的密钥与配置
迁移Helm存储值到HashiCorp Vault并通过Helm调用的实操步骤
一、Vault 前置配置
- 确认本地K8s集群已部署Vault,完成初始化、unseal操作,并配置好基础访问策略。
- 启用KV版本2引擎(推荐支持版本控制):
vault secrets enable -path=helm-secrets kv-v2 - 创建K8s服务账户,为其分配仅能读取
helm-secrets路径的Vault策略,并绑定Vault的K8s认证方法,确保集群内组件可通过K8s身份访问Vault。
二、迁移Helm中的值到Vault
1. 导出现有Helm值
从已部署的Helm release中导出所有配置值,方便提取需要迁移的敏感数据:
helm get values <你的release名称> --all > helm-values-backup.yaml
从备份文件中筛选出需要迁移的环境变量、密钥等敏感内容,整理成键值对格式。
2. 写入Vault KV引擎
用vault kv put命令将整理好的值写入Vault:
# 单个键值写入 vault kv put helm-secrets/<你的应用名称> db_password=xxx api_key=yyy # 批量写入(将键值存为JSON文件后导入) vault kv put helm-secrets/<你的应用名称> @secrets.json
注意:敏感值优先用文件批量写入,避免命令行历史泄露。
三、通过Helm调用Vault中的值
以下两种方案按需选择:
方案1:使用Helm-Vault插件(直接在Helm命令中读取)
- 安装helm-vault插件:
helm plugin install https://github.com/hashicorp/vault-helm-plugin - 配置Vault访问参数:
export VAULT_ADDR=https://你的Vault端点:8200 # 若使用K8s认证,获取服务账户JWT并生成Vault令牌 export VAULT_TOKEN=$(vault write -field=token auth/kubernetes/login role=helm-role jwt=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)) - 在Helm操作中引用Vault值:
直接在--set参数中使用vault://路径:
或在values.yaml中直接配置引用路径,再执行Helm安装/升级命令:helm upgrade --install <你的应用名称> ./你的chart目录 \ --set db.password=vault://helm-secrets/<你的应用名称>/db_password \ --set api.key=vault://helm-secrets/<你的应用名称>/api_keydb: password: vault://helm-secrets/<你的应用名称>/db_password api: key: vault://helm-secrets/<你的应用名称>/api_key
方案2:使用Vault Agent Injector(Pod运行时注入)
此方案无需修改Helm的核心配置,通过Sidecar容器自动注入Vault值:
- 确保Vault Helm chart部署时已启用Agent Injector组件。
- 在应用chart的Deployment模板中添加Vault注解:
Pod启动时,Vault Agent会自动将指定路径下的键值注入为环境变量,应用直接读取环境变量即可,Helm仅需管理注解配置。metadata: annotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "<你的应用Vault角色>" vault.hashicorp.com/secrets-path: "helm-secrets/<你的应用名称>" vault.hashicorp.com/env-inject: "true"
四、关键注意事项
- 迁移完成后,清理Helm中存储的敏感值,删除旧values文件中的敏感内容并重新打包chart。
- 遵循最小权限原则,给Vault访问策略仅授予必要路径的读取权限。
- 先在非生产环境验证流程,确保值能正确读取和注入后再推广到生产环境。
内容的提问来源于stack exchange,提问作者kingfateh khan
相关产品推荐
相关产品推荐

