MongoDB 无法原生对接 HashiCorp Vault 获取凭据,必须通过外部组件(如 Telegraf、应用层或 Operator)中转;Telegraf 支持 Vault KV v2 读取与 MongoDB 指标写入,但动态数据库凭据需应用自行调用 Vault API 并管理租约续期。

不能直接让 MongoDB 自身从 HashiCorp Vault 拉取凭据启动 —— 它不原生支持 Vault 的 secret engine 调用。实际可行路径是:由外部组件(如 Telegraf、应用层、或 Operator)对接 Vault 获取凭据,再注入到 MongoDB 连接上下文里。
Telegraf 是目前最轻量且文档最全的集成入口
HashiCorp 官方提供了 hashicorp_vault 输入插件,配合 mongodb 输出插件,可完成「从 Vault 拉 token/DB 凭据 → 推指标到 MongoDB」的闭环。但注意:这不是给 MongoDB 本身配 Vault,而是用 Telegraf 当中间人。
- 必须在 Telegraf 配置中显式指定
token或token_file,Vault API 地址默认走http://127.0.0.1:8200,若 Vault 启用了 TLS,需额外配置tls_ca、tls_cert等字段 -
hashicorp_vault插件只支持读取 KV v2 secrets(路径形如secret/data/mongodb/app),不支持动态生成的数据库租约凭据(如database/creds/my-role)—— 后者需要应用自己调用 Vault API - 若你真想用动态 DB 凭据(即每次连接都换密码),得改应用代码,用 Vault SDK 调用
/v1/database/creds/<role>,再把返回的username和password填进 MongoDB 连接字符串
MongoDB Kubernetes Operator 不支持 Vault 动态凭据注入
官方明确限制:在多集群部署场景下,MongoDBMultiCluster、MongoDBOpsManager 等资源 **完全禁用** HashiCorp Vault 作为密钥后端。即使单集群,Operator 也只接受静态 Secret 引用(如 spec.credentials.secretRef.name),不会主动轮询 Vault。
- 你只能手动把 Vault 返回的凭据写成 Kubernetes
Secret,再挂给 Operator 使用;这意味着凭据更新后,必须触发 Operator 重启或 patch Secret,没有自动刷新机制 - Operator 的
keyFile(用于副本集内部认证)和 TLS 证书仍需本地挂载,Vault 无法替代这些文件类密钥的分发 - 如果你依赖 Vault 的租约(lease)自动续期或吊销能力,Operator 当前版本(v1.26)对此无感知,也不会响应
lease_id变更
应用层集成才是动态凭据落地的关键环节
真正实现「凭据随用随取、过期即废」,必须由业务应用自己对接 Vault。典型流程是:应用启动时调一次 Vault API 拿凭据 → 缓存到内存 → 连接 MongoDB → 定期(比如每 80% lease_duration)主动续期或重拉。
- Node.js 示例中,用
@hashicorp/vault-client调用read('database/creds/my-app-role'),拿到data.username和data.password后拼接为mongodb://<user>:<pass>@host/db - 务必处理 Vault 返回的
lease_duration和renewable字段;若为 false,说明凭据不可续期,应用需在到期前重新申请 - 不要把 Vault token 存在环境变量或配置文件里 —— 应使用 Kubernetes ServiceAccount + Vault JWT auth,通过
service_account_name和namespace在 Vault 中绑定策略
Vault 和 MongoDB 的集成边界很清晰:Vault 不是数据库的配置中心,而是凭据的生命周期管理者。所有「动态」能力都发生在应用或代理层,MongoDB 本身永远只认静态字符串连接信息。最容易被忽略的是租约续期逻辑 —— 很多人只做了一次拉取,没写续期或 fallback 重试,结果服务跑着跑着就因凭据过期断连。


















