K8s Deployment中source Vault secrets后环境变量未生效问题排查
问题根因
postStart钩子执行的source /vault/secrets/cloudquery是在独立的子shell进程中运行的,这个操作只会修改该子shell的环境变量,不会传递到容器的主进程环境里,所以你进入Pod后看不到设置的环境变量。
解决方案
方案1:修改容器启动命令(直接加载)
将容器的启动命令改为先加载secrets文件,再启动主程序,确保环境变量在主进程生效:
containers: - name: cloudquery # 替换成你的主程序命令 command: ["/bin/sh", "-c"] args: ["source /vault/secrets/cloudquery && exec your-main-application-command"]
用exec是让主程序替换当前shell进程,保证容器能正确接收信号(比如停止命令)。
方案2:用Vault Agent直接注入环境变量(推荐)
不需要手动处理文件和source,通过Vault的注解直接将secret转为容器环境变量:
metadata: annotations: vault.hashicorp.com/role: default vault.hashicorp.com/agent-inject: 'true' # 移除原来的template注解,改用env注入 vault.hashicorp.com/agent-inject-env-MYSECRET: "path/to/mysecret#MYSECRET"
Vault Agent会自动把path/to/mysecret路径下的MYSECRET字段注入为容器的环境变量,启动后直接可用。
方案3:Init Container预处理(复杂场景适用)
如果必须保留文件加载的方式,用Init Container把secrets文件复制到共享目录,主容器启动时读取:
spec: initContainers: - name: prepare-secrets image: busybox:latest command: ["/bin/sh", "-c"] args: ["cp /vault/secrets/cloudquery /var/secrets/cloudquery && chmod 644 /var/secrets/cloudquery"] volumeMounts: - name: vault-secrets mountPath: /vault/secrets - name: shared-secrets mountPath: /var/secrets containers: - name: cloudquery command: ["/bin/sh", "-c"] args: ["source /var/secrets/cloudquery && exec your-main-application-command"] volumeMounts: - name: shared-secrets mountPath: /var/secrets volumes: - name: shared-secrets emptyDir: {}
验证步骤
- 进入Pod后,先检查
/vault/secrets/cloudquery文件是否存在,内容是否正确:
cat /vault/secrets/cloudquery
- 确认Vault Agent已经成功注入secret:查看Pod日志中Vault Agent的输出,确认没有报错。
内容的提问来源于stack exchange,提问作者dobbs
相关产品推荐
相关产品推荐

