我有一个简单的Spring启动应用程序,我需要在开发时部署它,并使用Helm在Kubernetes集群上生成不同的命名空间。
我正在考虑为每个环境保留多个application.properties(application-dev.properties,application-prod.properties)文件,然后通过values.yaml文件从它们创建配置文件,这些文件对于每个环境也会有所不同并指定当我执行Helm升级时。
现在的问题是我如何使用config.maps中的值,因为我知道我可以在容器中挂载属性文件,例如/deployment/application.properties
或将每个属性公开为容器内的环境变量。
但是如何从Java应用程序中使用它们呢?
此外,当我创建容器映像时,它在/ resources / files内嵌了当前应用程序.properties,这是应用程序默认使用的,所以当应用程序在容器内运行时,我需要覆盖此行为当它刚刚构建并在开发人员桌面上手动运行时。
答案 0 :(得分:5)
Springboot可以自动从环境变量中推断出变量。在application.properties或application.yaml中,只需使用$ {MY_ENVIRONMENT_VARIABLE:my-defaultvalue}。
使用helm填充configmap。
将configmap用作部署清单中的环境变量。
这样,您不需要为图像中的dev,int,prod设置多个application.properties。在整个部署中保持完好无损。
然后在你的头盔图中,你可以拥有多个values.yaml示例值-dev.yaml或values-int.yaml。您还可以从命令行动态设置helm值,覆盖yaml文件。
我在github https://github.com/balchua/demo中有一个演示应用程序,它使用了这种模式。
答案 1 :(得分:0)
你可以使用环境变量,如Bal Chua建议的那样。如果这样做,您可以使用--set在安装时覆盖特定值,或者如果您有大量配置,则可以使用' - values'标志并传入自定义values.yaml文件。
另一种方法是使用.Files.Glob(示例in github)加载整个文件,并将该文件作为图表的一部分加载。然后,您可以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来编码内容。如果没有指定,许多头盔图可以生成随机密码,但我猜你可能不需要。
答案 2 :(得分:0)
我建议将application.properties
内的文件(application.yml
或ConfigMap
)安装到Spring Boot可以自动检测到的文件系统的某个位置 - 然后你的应用程序保持简洁