如何使用通过 Helm 部署的 Java Spring 引导应用程序中的配置映射中的属性

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

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

现在的问题是,我如何使用config.maps中的值,因为我可以把属性文件挂载在容器内,例如/deployment/application.properties。

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

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

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


答案 1

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

这样,您就不需要在映像中为 dev,int,prod 提供多个 application.properties。在整个部署过程中保持其完整性。

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

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


答案 2

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

另一种方法是使用 加载整个文件。Files.Glob(github 中的示例)并将文件作为图表的一部分加载。然后,可以将该文件装载到 /config,以便在 spring 引导应用程序中使用它。然后,您的配置文件将采用与Spring引导配置文件相同的形式,而不是helm values.yaml。虽然在许多情况下不需要有太大的区别。

有一个关于如何对机密执行类似操作的讨论(大概你会想要将密码放在机密中),并将其用于 https://dzone.com/articles/hunting-treasure-with-kubernetes-configmaps-and-se 中的CI / CD(这是github示例附带的文章)。基本上你会使用.Files.Glob with .AsSecrets 而不是 .AsConfig 以便对内容进行编码。如果未指定,许多舵手图都可以选择生成随机密码,但我想您可能不需要它。


推荐