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

如何在不覆盖镜像Entrypoint的情况下将Vault Secret注入Pod环境变量?

如何在不覆盖K8s容器默认Entrypoint的前提下注入Vault Secret环境变量

方案一:直接使用Vault Agent Injector的环境变量注入注解

这是最简洁的方案,无需修改容器的启动命令或参数,直接通过注解将Vault Secret映射为容器环境变量,完全保留镜像默认的Entrypoint和CMD。

配置示例:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  labels:
    app: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
      annotations:
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/role: 'web'
        # 格式:vault.hashicorp.com/agent-inject-env-<环境变量名>: '<secret路径>:<secret键名>'
        vault.hashicorp.com/agent-inject-env-api_key: 'secret/data/web:payments_api_key'
    spec:
      serviceAccountName: web
      containers:
        - name: web
          image: alpine:latest
          ports:
            - containerPort: 9090

原理:Vault Agent Injector会自动创建sidecar容器拉取Secret,并将指定的键值对注入为主容器的环境变量,整个过程不改动主容器的启动配置。

方案二:使用Init容器预加载环境变量(适配复杂场景)

如果需要处理更复杂的环境变量逻辑(比如多Secret合并、自定义格式转换),可以用Init容器提前拉取并生成环境变量文件,再通过主容器的启动逻辑加载,同时保留原Entrypoint。

配置示例:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  labels:
    app: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
      annotations:
        vault.hashicorp.com/agent-init: 'true'
        vault.hashicorp.com/role: 'web'
        vault.hashicorp.com/agent-inject-secret-config: 'secret/data/web'
        vault.hashicorp.com/agent-inject-template-config: |
          {{ with secret "secret/data/web" -}}
          export api_key="{{ .Data.data.payments_api_key }}"
          {{- end }}
    spec:
      serviceAccountName: web
      volumes:
        - name: vault-secrets
          emptyDir: {}
      initContainers:
        - name: vault-agent-init
          image: hashicorp/vault-k8s:latest
          volumeMounts:
            - name: vault-secrets
              mountPath: /vault/secrets
      containers:
        - name: web
          image: alpine:latest
          volumeMounts:
            - name: vault-secrets
              mountPath: /vault/secrets
          # 通过exec保留原Entrypoint:先加载环境变量,再执行原启动命令
          command: ["sh", "-c"]
          args: ["source /vault/secrets/config && exec \"$0\" \"$@\"", "/usr/local/bin/原启动命令", "参数1", "参数2"]
          ports:
            - containerPort: 9090

说明:exec "$0" "$@"会将后续的参数作为原Entrypoint命令执行,避免覆盖镜像默认配置。如果不确定原镜像的Entrypoint和CMD,可以通过docker inspect <镜像名>查看后填入。

方案三:利用PodPreset批量注入(可选)

如果多个Deployment需要相同的Vault注入配置,可以用PodPreset统一管理注解,避免重复配置,同时同样不影响容器的默认启动逻辑。

内容的提问来源于stack exchange,提问作者Moritz Wolff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:10:20