vault agent injector通过mutating webhook机制实现sidecar自动密钥注入:先启用kubernetes认证并配置api地址、ca证书与token发行者,再部署injector组件监听pod创建请求,仅对含vault.hashicorp.com/agent-inject: "true"注解的pod注入initcontainer和sidecar容器,密钥以文件形式挂载至共享卷供应用读取。

在Kubernetes中用Vault Agent实现Sidecar自动密钥注入,核心是让Vault Agent容器作为应用Pod的伴生容器,不侵入业务代码,又能安全、动态地提供密钥。整个过程依赖Mutating Webhook机制和Kubernetes服务账户认证,不是手动挂载或写死配置。
启用并配置Vault Kubernetes认证方法
这是信任链的起点。Vault必须能验证Pod身份,而Kubernetes ServiceAccount Token就是凭证。
- 在Vault中启用Kubernetes auth:`vault auth enable kubernetes`
- 配置Vault信任集群API Server:提供Kubernetes API地址、CA证书(通常来自`/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`)和ServiceAccount Token的预期发行者(如`kubernetes/serviceaccount`)
- 为特定命名空间或ServiceAccount绑定策略,例如授予`default`服务账户读取`secret/data/app/db`的权限
部署Vault Agent Injector组件
Injector是一个独立的Deployment,它监听APIServer的Pod创建请求,并按规则改写Pod定义。
- 安装官方Helm Chart或手动部署injector Deployment、Service、MutatingWebhookConfiguration等资源
- 确保MutatingWebhookConfiguration中的caBundle与集群CA一致(通常通过脚本自动生成并注入)
- Webhook默认只处理带注解`vault.hashicorp.com/agent-inject: "true"`的Pod,避免全局干扰
在Pod中声明密钥需求和注入规则
不需要修改应用镜像,只需在Pod模板的metadata.annotations里说明要什么密钥、怎么用。
- 开启注入:`vault.hashicorp.com/agent-inject: "true"`
- 指定密钥路径:`vault.hashicorp.com/agent-inject-secret-db-creds: "secret/data/app/db"`
- 可选模板定制:用`vault.hashicorp.com/agent-inject-template-db-creds`定义如何渲染成文件(如JSON、env vars)
- 指定ServiceAccount:确保Pod使用的SA已在Vault中授权,例如`serviceAccountName: vault-auth`
理解注入后的工作流
Pod启动时,Injector已插入两个容器:一个initContainer负责首次拉取密钥并生成配置;一个sidecar容器持续轮询更新,保持密钥新鲜。
- 密钥默认以文件形式挂载到共享EmptyDir卷,路径如
/vault/secrets/db-creds - 应用容器通过读取该路径下的文件获取数据库用户名、密码等,无需直连Vault
- Agent会自动处理租约续期,密钥过期前刷新;若Vault吊销路径,Agent也会同步失效本地副本











