Kubernetes configMap 还是持久卷?

Kubernetes configMap or persistent volume?

将多个配置文件传递到 POD 的最佳方法是什么? 假设我们有一个遗留应用程序,我们必须在 Kubernetes 环境中进行 dockerize 和 运行。此应用程序需要传递 100 多个配置文件。最好的解决方案是什么?创建 hostPath 卷并将其挂载到主机上包含配置文件的某个目录?或者也许配置映射允许将所有内容作为单个压缩文件传递,然后将其提取到 pod 卷中? 也许 helm 允许以某种方式迭代某个目录,并自动创建一个将充当目录的大 configMap?

欢迎提出任何建议

Create hostPath volume and mount it to some directory containing config files on the host machine

应该避免这种情况。

可能并不总是允许访问主机路径。 Kubernetes 可能会使用 PodSecurityPolicies(很快就会被 OPA/Gatekeeper/whatever 你想要的准入控制器取代......),OpenShift 有一个类似的 SecurityContextConstraint 对象,允许定义用户可以做什么的策略。作为一般规则:将禁止访问 hostPaths。

此外,hostPaths 设备是您的其中一个节点的本地设备。如果出现任何中断,您将无法将 Pod 安排在其他地方。您已经设置了一个 nodeSelector 将其部署限制在单个节点上,并且只要您的节点存在,您的应用程序就会完成。或者没有放置规则,您的应用程序可能会在没有配置的情况下重新启动。

现在您可以说:“如果我从某种 NFS 共享挂载我的卷,...”。这是真的。但是,使用 PersistentVolumeClaim 可能会更好。

Create automatically one big configMap that will act as a directory

这可能是一个选项。尽管正如@larsks 在对 post 的评论中指出的那样:请注意 ConfigMaps 在大小方面是有限的。操作大型对象(频繁 edit/updates)可能会增加 etcd 数据库的大小。

如果您真的有 ~100 个文件,ConfigMaps 可能不是这里的最佳选择。

What next?

没有一个好的答案,不知道我们在说什么。

如果你想允许在不重启容器的情况下编辑这些配置,使用一些 PersistentVolumeClaim 是有意义的。

如果不需要,ConfigMaps 可能会有所帮助,前提是您可以稍微限制它们的数量并坚持使用 non-critical 数据。虽然 Secrets 可用于存储密码或任何敏感的配置片段。

一些 emptyDir 也可以使用,假设你能找到一种方法在容器启动期间自动配置这些配置(例如:git clone in some initContainer,and/or some shell脚本根据一些环境变量将您的配置上下文化)

如果有些文件预计不会随时间变化,或者其生命周期与容器映像中的应用程序版本的生命周期密切相关:我会考虑将它们添加到我的 Dockerfile 中。甚至可以添加一些启动脚本——您可以从 initContainer 轻松调用的脚本,生成您无法在映像中发布的任何配置。

根据您要处理的内容,您可以结合使用 PVC、emptyDirs、ConfigMaps、Secrets、git 存储的配置、脚本……