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


102

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

Answers:


154

例如,您有一个configmap,其中包含2个配置文件:

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

您可以使用如下子路径将单个文件装入现有目录:

---
        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"
---

完整的例子在这里


5
困惑为什么在OP仅需要1时显示2个文件的示例,但我认为对于单个文件来说,这同样适用。
兰迪·L

6
@ the0ther是的,只是为了弄清楚它如何处理多个文件
Tommy Nguyen

@TommyNguyen,如果我只想安装我的主路径而不是./abc.txt之类的子路径,有什么办法,其中abc.txt位于主文件夹而不是子文件夹的容器内。
PrinceT

2
如果文件不是ConfigMap或不在ConfigMap中怎么办?是否可以从本地磁盘挂载任意文件?
LondonRob

3
@LondonRob,您应该使用hostPath,请参阅kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

46

我将从这里开始这个工作示例。确保您至少使用Kubernetes 1.3。

只需像这样创建一个ConfigMap:

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

然后创建一个像这样的pod:

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

1
就像已经提到的OP一样,这将不希望地覆盖整个目录。
davegallant

5
我不同意 测试了包括“ subPath”在内的方法,仅挂载了文件,而不挂载了整个目录。经过Kubernetes 1.5测试。
dmorlock

@dmorlock这个问题的措词不明确。这将作为标题指出“将一个文件共享/装入一个Pod”,就像问题询问“共享一个配置文件而不装入目录”一样
Joel B

1
我现在不得不问过三遍这个问题,因为在kubernetes.io/docs/tasks/configure-pod-container/…的文档中没有任何地方提到“ subpath” 一词。我想这是一个需要创建和提交的友好文档PR。
托德·里昂斯

@JoelB,如果我只想挂载我的主路径而不是子路径,如./abc.txt,其中abc.txt位于主文件夹而不是子文件夹的容器内,有什么方法。
PrinceT

7

当前(v1.0,v1.1)无法卷安装单个配置文件。Secret结构自然可以表示多个秘密,这意味着它必须是一个目录。

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

同时,您可以挂载目录并从映像中对其进行符号链接,也许吗?


1
这仍然是真的吗?
neu242 '16

7
您现在可以使用volumeMounts的subPath功能获取单个文件
Tim Hockin

1
目前这是可能的。检查上面的答案:stackoverflow.com/a/43404857/5091346
Andrii Abramov

0

假设您要将新的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"}]}]}}}}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.