如何在多节点集群上的 Kubernetes Pod 中使用 ConfigMap 放置整个目录及其子目录?

问题描述 投票:0回答:3

问题

  • 我们想重复使用同一张图像
  • 我们有不同的静态文件(例如 css),它们在不同的部署中应该有所不同。应保留这些文件的文件夹结构。

例如:

  1. test1.xml
  2. test2.xml
  3. 布局
      3.1 test1.css
      3.1 test2.css

我们需要将这些文件一次(在启动时)放入 Pod 中。

据我所知,我只能在一个目录级别中创建一个所有文件的 ConfigMap,并且我必须重新创建该结构。

例如

kubectl create configmap style-files --from-file=.

在上面的示例中,此命令只会为 xml 文件创建 ConfigMap。

预期行为

行为类似于 ConfigMap,但能够创建一个包含当前目录中的所有文件和子目录中的所有文件的单个 ConfigMap,同时保留文件夹结构。

问题

是否有一些针对我的用例的概念,或者我是否必须使用 ConfigMap?

docker kubernetes configmap mounted-volumes
3个回答
4
投票

目录中的示例文件:

.
├── test21.css
├── test22.css
├── test2.xml
└── test.xml

Create configmap:
    kubectl create configmap example --from-file=./

示例配置图:

apiVersion: v1
data:
  test.xml: |
    test1
    test1
  test2.xml: |
    test2
    test2
  test21.css: |
    test21
    test21
  test22.css: |
    test22
    test22
kind: ConfigMap

带有投影 ConfigMap 键的卷的示例 pod:

apiVersion: v1
kind: Pod
metadata:
  name: busy
spec:
  containers:
  - name: busybox
    image: k8s.gcr.io/busybox
    command: ["/bin/sh"]
    args: ["-c", "sleep 200"]
    volumeMounts:
    - mountPath: /test
      name: data1
  volumes:
    - name: data1
      configMap:
        name: example
        items:
        - key: test.xml
          path: test.xml
        - key: test2.xml
          path: test2.xml
        - key: test21.css
          path: layout/test21.css
        - key: test22.css
          path: layout/test22.css

注:

您可以基于每个文件将密钥投影到特定路径和特定权限。

您可以使用投影卷将此示例与不同的源(例如秘密和配置映射)结合起来: 投影卷将多个现有卷源映射到同一目录中。

apiVersion: v1
kind: Pod
metadata:
  name: busy
spec:
  containers:
  - name: busybox
    image: k8s.gcr.io/busybox
    command: ["/bin/sh"]
    args: ["-c", "sleep 200"]
    volumeMounts:
    - mountPath: /test
      name: data1
  volumes:
    - name: data1
      projected:
        sources:
        - configMap:
            name: example
            items:
              - key: test.xml
                path: test.xml
              - key: test2.xml
                path: test2.xml
              - key: test21.css
                path: layout/test21.css
              - key: test22.css
                path: layout/test22.css

另一种方法是使用 zip/jar 文件作为 configmap(configmap 支持二进制文件),因此安装后可以将其解压缩到容器内所需的路径中,或使用 init 容器准备适当的文件夹结构或使用重新填充的数据构建映像。

资源:

希望这有帮助。


1
投票

您可以在集群内可访问的位置(例如 s3 存储或简单的 http 服务器)提供存档文件,并使用配置映射为 pod 配置正确的 URL 以下载文件。 要下载并提取存档,您可以结合使用初始化容器和卷安装。

有关初始化容器的更多信息:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/


1
投票

我建议使用配置映射,但您可能需要使用其中两个和两个安装座来重新创建层次结构,因为配置映射是平坦的。

将包含 XML 的一个安装到

/your/path/
,将另一个包含 CSS 的安装到
/your/path/layout

可能需要巧妙地使用

subpath
键以避免第一个
cm
覆盖第二个nd

© www.soinside.com 2019 - 2024. All rights reserved.