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

Sma*_*ana 70 kubernetes

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

Tom*_*yen 118

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

kubectl create configmap config --from-file <file1> --from-file <file2>
Run Code Online (Sandbox Code Playgroud)

您可以使用这样的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"
---
Run Code Online (Sandbox Code Playgroud)

完整的例子在这里

  • **注意**:使用 ConfigMap 作为子路径卷的容器将不会接收 ConfigMap 更新。https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ (8认同)
  • 混淆为什么这显示2个文件的例子,当OP只需要1时,我认为同样适用于单个文件的情况. (4认同)
  • 请注意,如果我们处理“大”文件,这种方法很可能不起作用,ConfigMap 端有限制 (1MiB) (4认同)
  • @ the0ther是的,只是为了弄清楚它是如何与多个文件一起工作的 (3认同)
  • 如果文件不是 ConfigMap,或者不在 ConfigMap 中怎么办?是否可以从本地磁盘挂载任意文件? (3认同)
  • @LondonRob 在您的情况下,您应该使用 hostPath,请参阅 https://kubernetes.io/docs/concepts/storage/volumes/#hostpath (3认同)
  • 为了让 @Michael 对 subPath 的评论更加清晰。该卷不会接收 ConfigMap 更新意味着 Pod 将继续使用在 Pod 启动期间复制的 ConfigMap 的**初始内容**。您需要重新启动或重新创建 Pod 才能合并更改。 (3认同)

Joe*_*l B 35

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

只需创建一个这样的ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data
Run Code Online (Sandbox Code Playgroud)

然后像这样创建一个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
Run Code Online (Sandbox Code Playgroud)

  • 我不同意.测试了包括"subPath"的方法,只安装了文件而不是整个目录.用Kubernetes 1.5测试. (5认同)
  • 这会像已经提到的 OP 一样覆盖整个目录。 (2认同)
  • 我现在不得不问这个问题三遍了,因为 https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ 文档中的任何地方都没有提到“子路径”这个词#add-configmap-data-to-a-specific-path-in-the-volume 。我想这是一个需要创建和提交的友好文档 PR。 (2认同)

Ale*_*san 9

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

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

我也尝试过这个:

          volumeMounts:
            - mountPath: /opt/project/
              name: config-override
              subPath: config.override.json
          command:
            - ls
            - -l
            - /opt/project
Run Code Online (Sandbox Code Playgroud)

很明显,当它/opt/project尝试将 json 文件挂载到其中时,它会列出为空目录。config.override.json在这种情况下,不会创建具有名称的文件。

PS:安装到文件的唯一方法是:

          volumeMounts:
            - mountPath: /opt/project/override
              name: config-override
          command:
            - ls
            - -l
            - /opt/project/override
Run Code Online (Sandbox Code Playgroud)

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

lrwxrwxrwx 1 root root 27 Jun 27 14:37 config.override.json -> ..data/config.override.json
Run Code Online (Sandbox Code Playgroud)

  • 很确定你的倒数第二个代码块中有一个拼写错误 - `ls` 应该是 `ln`。 (3认同)

Tim*_*kin 6

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

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

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

  • 您可以使用volumeMounts的subPath功能立即获取单个文件 (5认同)

nol*_*w38 5

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

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

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/destination_environment.js"
          subPath: "environment.js"
      volumes:
        - name: "config"
          configMap:
            name: "config"
---
Run Code Online (Sandbox Code Playgroud)