将一个文件共享/挂载到一个 pod 中的最佳方法是什么?

我正在考虑使用机密挂载一个单一的文件,但似乎你只能挂载目录,将覆盖所有其他内容。如何在不挂载目录的情况下共享单个配置文件?

152266 次浏览

目前(v1.0,v1.1)没有办法卷装一个配置文件。Secret 结构自然能够表示多个机密,这意味着它必须是一个目录。

当我们得到配置对象时,应该支持单个文件。

与此同时,您可以挂载一个目录,并从您的映像符号链接到它,也许?

我将从 给你中的这个工作示例开始,确保您至少使用了 Kubernetes 1.3。

像这样简单地创建一个 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
name: test-pd-plus-cfgmap
data:
file-from-cfgmap: file data

然后创建一个像这样的豆荚:

apiVersion: v1
kind: Pod
metadata:
name: test-pd-plus-cfgmap
spec:
containers:
- image: ubuntu
name: bash
stdin: true
stdinOnce: true
tty: true
volumeMounts:
- mountPath: /mnt
name: pd
- mountPath: /mnt/file-from-cfgmap
name: cfgmap
subPath: file-from-cfgmap
volumes:
- name: pd
gcePersistentDisk:
pdName: testdisk
- name: cfgmap
configMap:
name: test-pd-plus-cfgmap

例如,您有一个包含2个配置文件的配置图:

kubectl create configmap config --from-file <file1> --from-file <file2>

您可以像下面这样使用 subPath 将单个文件挂载到现有目录:

---
volumeMounts:
- name: "config"
mountPath: "/<existing folder>/<file1>"
subPath: "<file1>"
- name: "config"
mountPath: "/<existing folder>/<file2>"
subPath: "<file2>"
restartPolicy: Always
volumes:
- name: "config"
configMap:
name: "config"
---

全例 给你

假设您希望将一个新的 Log4j2.xml挂载到正在运行的部署中,以增强日志记录

# Variables
k8s_namespace=xcs
deployment_name=orders-service
container_name=orders-service
container_working_dir=/opt/orders-service


# Create config map and patch deployment
kubectl -n ${k8s_namespace} create cm log4j \
--from-file=log4j2.xml=./log4j2.xml


kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
-p '{"spec":{"template":{"spec":{"volumes":[{"configMap":{"defaultMode": 420,"name": "log4j"},"name": "log4j"}]}}}}'


kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
-p '{"spec":{"template":{"spec":{"containers":[{"name": "'${container_name}'","volumeMounts": [{  "mountPath": "'${container_working_dir}'/log4j2.xml","name": "log4j","subPath": "log4j2.xml"}]}]}}}}'


关于已被接受的答案,还有一个有用的补充信息:

假设您的原始文件名为 Environment. js,并且您希望目标文件名为 destin_ Environment。Js,那么,yaml 文件应该是这样的:

---
volumeMounts:
- name: "config"
mountPath: "/<existing folder>/destination_environment.js"
subPath: "environment.js"
volumes:
- name: "config"
configMap:
name: "config"
---

我没有投票或回复帖子的名声,所以我在这里发帖。最受欢迎的答案并不像它所说的那样有效(至少在 k8s 1.21.1中是这样的) :

          volumeMounts:
- mountPath: /opt/project/config.override.json
name: config-override
subPath: config.override.json
command:
- ls
- -l
- /opt/project/config.override.json
< p > 生成一个空的 dir /opt/project/config.override.json。 我已经花了几个小时在文档和谷歌中搜索,但仍然无法将这个单独的 json 文件挂载为 json 文件。译注:

我也试过这个:

          volumeMounts:
- mountPath: /opt/project/
name: config-override
subPath: config.override.json
command:
- ls
- -l
- /opt/project

很明显,当它试图挂载一个 json 文件时,它将 /opt/project列为空 dir。在这种情况下不会创建名为 config.override.json的文件。

附言: 挂载到文件的唯一方法是:

          volumeMounts:
- mountPath: /opt/project/override
name: config-override
command:
- ls
- -l
- /opt/project/override

它创建一个目录 /opt/project/override,并将 configMap 创建中使用的原始文件名符号链接到所需的内容:

lrwxrwxrwx 1 root root 27 Jun 27 14:37 config.override.json -> ..data/config.override.json