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

时间:2015-10-29 13:43:08

标签: kubernetes

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

7 个答案:

答案 0 :(得分:86)

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

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

完整示例here

答案 1 :(得分:34)

我从here的这个工作示例开始。确保您至少使用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

答案 2 :(得分:6)

目前(v1.0,v1.1)无法批量装入单个配置文件。 Secret结构自然能够表示多个秘密,这意味着它必须是一个目录。

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

同时您可以从图像中安装目录和符号链接吗?

答案 3 :(得分:2)

请使用secrets。这被认为是最佳实践。如果您不确定如何使用它们,请查看我的操作here

答案 4 :(得分:1)

关于已接受答案的有用的附加信息:

假设您的原始文件名为environment.js,并且您希望将目标文件命名为destination_environment.js,那么您的yaml文件应如下所示:

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

答案 5 :(得分: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"}]}]}}}}'

答案 6 :(得分:0)

我没有投票或回复主题的声誉,所以我会在这里发帖。投票最多的答案并不像它所说的那样有效(至少在 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

产生一个空目录 /opt/project/config.override.json。 我已经在文档和谷歌上挖掘了几个小时,但我仍然无法将这个单个 json 文件挂载为 json 文件。

我也试过这个:

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

很明显它把 /opt/project 列为空目录,因为它试图将一个 json 文件挂载到它上面。在这种情况下不会创建名为 config.override.json 的文件。

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

          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