在作业窗格中挂载配置文件结构

时间:2020-05-29 08:06:03

标签: kubernetes kubernetes-helm

在我们的应用程序中,我们将有一个Kubernetes作业,它将基于一组(旧)配置文件引导微服务。这些文件在旧版应用程序中打包为文件结构,我们希望保留此结构,这样就无需为Kubernetes变体和旧版变体维护不同的配置文件打包,并且有很多我们仍要使用的旧代码需要这种文件结构。

我的方法是我想在作业窗格中安装ConfigMap,因为我天真地假定您可以映射整个文件夹树,但是ConfigMap是平面键值存储。

我们正在使用Helm,所以我们的想法是微服务将包括该作业,并使用钩子对其进行应用。将配置文件结构映射到作业窗格的一种好方法是什么?您能否轻松地创建一个卷,并用strucutre文件填充它,然后将其安装在作业窗格中?

2 个答案:

答案 0 :(得分:0)

您可以通过create a configmapfiledirectory中的add configmap data to a volume。这将从已挂载目录中的configmap键创建只读文件。但是,无法将目录结构保留在Configmap中,因为它将因错误而失败

... a valid config key must consist of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name',  or 'KEY_NAME',  or 'key-name', regex used for validation is '[-._a-zA-Z0-9]+')

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
data:
  some.properties: |
    foo=bar
  other.properties: |
    baz=qux

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      args:
      - /bin/sh
      - -c
      - ls -la /etc/config; cat /etc/config/some/some.properties; cat /etc/config/other.properties
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: some.properties
          path: some/some.properties
        - key: other.properties
          path: other.properties

使用kubectl logs test

检查日志
 drwxrwxrwx    3 root     root            95 May 29 09:14 .
 drwxr-xr-x    1 root     root            20 May 29 09:14 ..
 drwxr-xr-x    3 root     root            42 May 29 09:14 ..2020_05_29_09_14_34.418889646
 lrwxrwxrwx    1 root     root            31 May 29 09:14 ..data -> ..2020_05_29_09_14_34.418889646
 lrwxrwxrwx    1 root     root            23 May 29 09:14 other.properties -> ..data/other.properties
 lrwxrwxrwx    1 root     root            11 May 29 09:14 some -> ..data/some
 foo=bar
 baz=qux

答案 1 :(得分:0)

有很多方法可以达到目的,有些方法比其他方法要好,所以我只想提到更好的方法。

理论上您可以使用configmaps来做,但是您还提到了 “ ...有很多旧版代码” ,因此,您需要知道configmaps的限制为1MB(更具体地说,我应该提到此限制是由etcd而不是configmap强制执行的本身)。 现在假设这不是问题,您将需要将每个文件作为一个密钥保存在configmap中,然后将每个文件分别安装到其目录中。当然,当有多个文件时,您可以通过不理想的解决方案来自动化此过程。


现在回答您的问题:

您可以轻松地创建一个卷,并用strucutre文件填充它,然后将其安装在作业窗格中吗?

获得上述结果的最简单方法可能是安装emptyDir卷并使用initContainers填充它。初始化容器可以从git repo或其他文件存储库中提取配置文件夹,并将其保存在emptyDit卷中,然后将其安装到实际容器中。 Here is an example的外观。

您所建议的也是有效的解决方案,但是它需要使用持久卷,并且可能并不总是必需的。但是,如果您决定使用它,那么您所要做的就是使用相同的卷名,并将retain用于persistentVolumeReclaimPolicy字段。

您还需要记住,init(hook)容器代码应该是幂等的。特别是,应准备写入EmptyDirs(持久卷)的代码,以防输出文件已经存在。