在我们的应用程序中,我们将有一个Kubernetes作业,它将基于一组(旧)配置文件引导微服务。这些文件在旧版应用程序中打包为文件结构,我们希望保留此结构,这样就无需为Kubernetes变体和旧版变体维护不同的配置文件打包,并且有很多我们仍要使用的旧代码需要这种文件结构。
我的方法是我想在作业窗格中安装ConfigMap
,因为我天真地假定您可以映射整个文件夹树,但是ConfigMap
是平面键值存储。
我们正在使用Helm,所以我们的想法是微服务将包括该作业,并使用钩子对其进行应用。将配置文件结构映射到作业窗格的一种好方法是什么?您能否轻松地创建一个卷,并用strucutre文件填充它,然后将其安装在作业窗格中?
答案 0 :(得分:0)
您可以通过create a configmap或file和directory中的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(持久卷)的代码,以防输出文件已经存在。