3

问题

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

例如:

  1. 测试1.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,其中包含当前目录中的所有文件和子目录中的所有文件,同时保留文件夹结构。

问题

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

4

3 回答 3

3

目录中的示例文件:

.
├── 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 容器准备适当的文件夹结构或使用重新填充的数据构建图像。

资源:

希望这有帮助。

于 2019-10-16T09:39:55.690 回答
1

您可以在集群内可访问的位置(fe s3 存储或简单的 http 服务器)提供存档文件,并使用配置映射为 pod 配置正确的 URL 以下载文件。要下载和解压缩存档,您可以使用与卷挂载相结合的 init 容器。

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

于 2019-10-15T15:10:31.340 回答
0

我建议使用 configmaps,但由于 configmaps 是平面的,因此您可能需要使用其中两个和两个挂载来重新创建层次结构。

将一个与您的 XML 一起挂载到/your/path/,将另一个包含 CSS 挂载到/your/path/layout.

可能需要巧妙地使用subpath密钥来避免第一个cm覆盖第二个。

于 2019-10-15T15:27:08.850 回答