如何在不覆盖镜像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
相关产品推荐
相关产品推荐

