如何在通过 Helm 部署的 Java Spring 引导应用程序中使用 configmaps 中的属性

How to consume properties from configmaps in Java Spring boot application deployed through Helm

我有一个简单的 Spring 启动应用程序,我需要在开发中部署它,并使用 Helm 在 Kubernetes 集群上生产不同的命名空间。

我正在考虑为每个环境保留多个 application.properties(application-dev.properties、application-prod.properties)文件,然后通过 values.yaml 文件从它们创建配置映射每个环境也会有所不同,并在我执行 Helm 升级时指定。

现在的问题是我如何使用 config.maps 中的值,据我所知,我可以将属性文件安装在容器中,例如 /deployment/application.properties

或者将每个 属性 作为容器内的环境变量公开。

但是我如何从 Java 应用程序中使用它们?

另外,在我创建容器映像时,它在 /resources/ 文件中嵌入了当前应用程序 .properties,这是应用程序默认使用的内容,因此我需要在应用程序 运行 时覆盖此行为在容器内与刚刚构建时相反,然后在开发人员桌面上手动 运行。

Springboot可以自动从环境变量推断变量。在您的 application.properties 或 application.yaml 中,只需使用 ${MY_ENVIRONMENT_VARIABLE:my-defaultvalue}.
使用 helm 来填充您的 configmap。 使用 configmap 作为部署清单中的环境变量。

这样您就不需要在图像中为 dev、int 和 prod 设置多个 application.properties。在整个部署过程中保持完整。

然后在您的 helm 图表中,您可以有多个 values.yaml 示例值 - dev.yaml 或值 - int.yaml。您还可以从命令行动态设置 helm 值,覆盖 yaml 文件。

我在 github https://github.com/balchua/demo 中有一个演示应用程序,它使用了这种模式。

您当然可以按照 Bal Chua 的建议使用环境变量。如果这样做,您可以在安装时使用 --set 覆盖特定值,或者如果您有很多配置,则可以使用 '-- values' 标志并传入自定义 values.yaml 文件。

另一种方法是使用 .Files.Glob 加载整个文件(例如 in github) and load the file as part of the chart. You can then mount the file to /config 在您的 spring 引导应用程序中使用它。然后您的配置文件将采用相同的形式作为 Spring 引导配置文件,而不是 helm values.yaml。尽管在许多情况下不需要太大区别。

讨论了如何对秘密进行类似操作(假设您希望将密码保密)并将其用于 https://dzone.com/articles/hunting-treasure-with-kubernetes-configmaps-and-se 中的 CI/CD(这是随附的文章github 示例)。基本上,您会使用 .Files.Glob 和 .AsSecrets 而不是 .AsConfig 来对内容进行编码。如果未指定,许多 helm chart 可以选择生成随机密码,但我猜你可能不需要那个。

我建议将 ConfigMap 中的文件(application.propertiesapplication.yml)挂载到 Spring Boot 可以自动检测到的文件系统上的某个位置 - 然后您的应用程序保持美观和简单