如何将Vault密钥注入K8s且不存储为K8s Secrets(含私有仓库场景)
从HashiCorp Vault向Kubernetes注入密钥(不存储为K8s Secrets)
前提条件
- 已部署并配置好HashiCorp Vault集群
- Kubernetes集群已与Vault完成身份认证集成(推荐用Kubernetes Auth方法)
- 私有镜像仓库的密钥(如
config.json内容)已存入Vault
核心方案:使用Vault Agent Injector
Vault Agent Injector是官方推荐的轻量方案,它会在Pod启动时自动注入Sidecar容器,从Vault拉取密钥并挂载到Pod文件系统中,全程不会创建持久化的K8s Secrets资源。
1. 配置Vault的Kubernetes Auth信任关系
先让Vault认可K8s集群的ServiceAccount:
- 启用Kubernetes Auth后端:
vault auth enable kubernetes - 配置Auth后端指向K8s API服务器:
vault write auth/kubernetes/config \ kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt - 创建读取镜像密钥的Policy:
新建docker-pull-policy.hcl文件:
加载到Vault:path "secret/data/docker/config" { capabilities = ["read"] }vault policy write docker-pull docker-pull-policy.hcl注:如果用Vault KV v1引擎,路径改为
secret/docker/config - 绑定ServiceAccount与Policy的Role:
vault write auth/kubernetes/role/docker-pull-role \ bound_service_account_names=my-app-sa \ bound_service_account_namespaces=my-namespace \ policies=docker-pull \ ttl=1h
2. 给Pod添加注解启用Agent注入
在Deployment或Pod的YAML中添加专属注解,让Injector自动处理密钥注入:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: my-namespace spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: annotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "docker-pull-role" # 指定要拉取的Vault密钥路径 vault.hashicorp.com/agent-inject-secret-dockerconfig: "secret/data/docker/config" # 模板:将Vault中的config_json内容输出为文件 vault.hashicorp.com/agent-inject-template-dockerconfig: | {{- with secret "secret/data/docker/config" -}} {{ .Data.data.config_json }} {{- end }} # 挂载路径:对应Docker默认配置路径 vault.hashicorp.com/agent-inject-volume-mount-dockerconfig: "/var/run/secrets/docker/config.json" # 仅在Pod启动时拉取一次密钥(适合镜像拉取场景) vault.hashicorp.com/agent-pre-populate-only: "true" labels: app: my-app spec: serviceAccountName: my-app-sa containers: - name: my-app image: private-registry.com/my-image:latest # 使用Agent自动创建的临时Volume作为镜像拉取配置 imagePullSecrets: - name: vault-agent-injector-dockerconfig
3. 验证注入效果
- 启动Deployment后,查看Pod容器列表,会看到
vault-agentsidecar容器 - 进入主容器检查挂载的配置文件:
能看到从Vault拉取的私有仓库配置,Pod会用该配置拉取镜像,且K8s集群中无对应Secret资源。kubectl exec -it my-app-xxxx-yyyy -c my-app -- cat /var/run/secrets/docker/config.json
关键细节
- 注入的密钥挂载为临时Volume,Pod删除后自动清理,无持久化存储风险
- Role的
ttl参数控制密钥有效期,到期后重启Pod可重新拉取新密钥 agent-pre-populate-only设为true避免Agent持续同步,适合镜像拉取这类一次性需求
替代方案:Vault CSI Driver
如果偏好CSI驱动模式,也可通过部署Vault CSI Driver实现:
- 部署CSI Driver到K8s集群
- 创建
CSIDriver和StorageClass资源 - 在Pod的Volume中引用Vault密钥路径,驱动会在Pod启动时挂载密钥到指定路径,同样不会生成K8s Secrets
不过Agent Injector更灵活,是镜像拉取场景的首选方案。
内容的提问来源于stack exchange,提问作者Michael Bahdir
相关产品推荐
相关产品推荐

