You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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文件:
    path "secret/data/docker/config" {
      capabilities = ["read"]
    }
    
    加载到Vault:
    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-agent sidecar容器
  • 进入主容器检查挂载的配置文件:
    kubectl exec -it my-app-xxxx-yyyy -c my-app -- cat /var/run/secrets/docker/config.json
    
    能看到从Vault拉取的私有仓库配置,Pod会用该配置拉取镜像,且K8s集群中无对应Secret资源。

关键细节

  • 注入的密钥挂载为临时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:06:16