如何在Kubernetes中通过Pod/定时任务更新HashiCorp Vault键值对?
在Kubernetes中用CronJob通过ServiceAccount更新Vault KV键值对
核心思路
利用Vault的Kubernetes认证方法,让CronJob的Pod通过自身的ServiceAccount JWT完成Vault认证,无需额外API密钥,再执行KV更新操作。以下是具体实现步骤:
1. 确认Vault已启用Kubernetes Auth
如果之前已配置过读取密钥用的Kubernetes Auth,可跳过此步。未配置的话,先启用并绑定集群:
# 启用Kubernetes Auth方法 vault auth enable kubernetes # 配置Vault与K8s集群的内部连接 vault write auth/kubernetes/config \ kubernetes_host="https://kubernetes.default.svc.cluster.local" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
2. 创建Vault更新策略
为ServiceAccount创建仅包含KV写入权限的策略,比如允许更新secret/app-config路径:
# 编写策略文件update-app-policy.hcl path "secret/data/app-config/*" { capabilities = ["create", "update", "patch"] } # 若用KV v1版本,路径改为"secret/app-config/*"
导入策略到Vault:
vault policy write update-app update-app-policy.hcl
3. 绑定ServiceAccount到Vault策略
假设CronJob使用app-vault-updater这个ServiceAccount(可复用现有读取用的SA),创建Vault角色关联该SA和策略:
vault write auth/kubernetes/role/app-updater-role \ bound_service_account_names=app-vault-updater \ bound_service_account_namespaces=your-namespace \ policies=update-app \ ttl=1h
4. 编写Kubernetes CronJob配置
创建CronJob YAML,使用Vault官方镜像完成认证与KV更新:
apiVersion: batch/v1 kind: CronJob metadata: name: vault-kv-updater namespace: your-namespace spec: schedule: "0 */6 * * *" # 每6小时执行一次,按需调整 jobTemplate: spec: template: spec: serviceAccountName: app-vault-updater containers: - name: vault-cli image: hashicorp/vault:latest command: - sh - -c - | export VAULT_ADDR=http://vault.vault.svc.cluster.local:8200 # 通过Kubernetes Auth自动登录(无需手动提供密钥) vault login -method=kubernetes role=app-updater-role # 执行KV更新,替换为实际的令牌生成逻辑 vault kv put -mount=secret app-config token=$(your-token-generation-command) # KV v1版本用:vault kv put secret/app-config token=$(your-token-generation-command) restartPolicy: OnFailure
关键细节
- 无API密钥依赖:Pod会自动挂载ServiceAccount的JWT到
/var/run/secrets/kubernetes.io/serviceaccount/token,Vault CLI会自动读取完成认证。 - 令牌生成逻辑:将
your-token-generation-command替换为实际获取新令牌的代码(比如调用内部API、生成随机字符串等)。 - 权限最小化:Vault策略仅赋予必要的KV写入权限,避免过度授权。
测试验证
先运行临时Pod验证流程:
kubectl run test-vault-update --serviceaccount=app-vault-updater --image=hashicorp/vault:latest -it --rm -- sh # 在Pod内执行: export VAULT_ADDR=http://vault.vault.svc.cluster.local:8200 vault login -method=kubernetes role=app-updater-role vault kv put -mount=secret app-config test-key=test-value
操作成功后再部署CronJob即可。
内容的提问来源于stack exchange,提问作者VladoPortos
相关产品推荐
相关产品推荐

