如何在Kubernetes中仅将Vault密钥挂载为指定文件?
解决方法
问题出在vault.hashicorp.com/secret-volume-path注解:当你将其设置为/usr/share/nginx/html时,Vault Agent会创建独立卷挂载到该目录,完全覆盖Nginx原本的静态文件目录,导致容器无法正常启动。
要仅挂载.env文件到目标路径,按以下步骤调整配置:
移除
secret-volume-path注解
这个注解会强制将整个卷挂载到指定目录,是目录被覆盖的根源,直接删除即可。保留现有注入配置
你的agent-inject-secret-.env和agent-inject-template-.env配置是正确的,Vault Agent会默认在/vault/secrets目录下生成.env文件。在Pod的volumeMounts中添加文件挂载
通过Kubernetes的文件挂载功能,将/vault/secrets/.env挂载到/usr/share/nginx/html/.env,这种方式不会覆盖整个目录,仅替换目标文件。
修改后的完整注解配置
vault.hashicorp.com/agent-init-first: "true" vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/agent-inject-secret-.env: configs/data/app/dev vault.hashicorp.com/agent-inject-template-.env: | {{- with secret (print "configs/data/app/dev") -}}{{- range $k, $v := .Data.data -}} {{ $k }}={{ $v }} {{ end }}{{- end -}} vault.hashicorp.com/role: app
对应Deployment的volumeMounts配置示例
spec: containers: - name: nginx image: nginx:latest volumeMounts: - name: vault-secrets mountPath: /usr/share/nginx/html/.env subPath: .env # 关键:用subPath指定要挂载的单个文件 volumes: - name: vault-secrets emptyDir: {} # Vault Agent会自动将密钥写入这个卷
原理说明
- Vault Agent会自动创建名为
vault-secrets的默认卷,并将生成的.env文件写入其中。 - 通过
subPath参数,告诉Kubernetes仅挂载卷中的.env文件到目标路径,而非替换整个/usr/share/nginx/html目录。
内容的提问来源于stack exchange,提问作者Murakami
相关产品推荐
相关产品推荐

