我是java和k8的新手,我对如何处理我的java应用程序的应用程序配置有一些疑问。我有一个春季启动应用程序,其他三个使用wildfly。
因此,他们都获得了硬编码的应用程序配置,并且在启动时只需使用以下内容:
java -Dswarm.project.stage=development -jar foobar/target/foobar-swarm.jar
除了具有由应用程序配置数据组成的application.properties文件的spring boot之外。
所以基本上三个java应用程序已经支持两个文件(我知道这是不是没有):
- project-stages.yml
- standalone.xml
当开发人员想要部署到生产时,他使用:
java -Dswarm.project.stage=production -jar foobar/target/foobar-swarm.jar
而且,现在我们来到kubernetes,它有三种处理应用程序配置数据的方法:
1.) Env variables
2.) Config maps
3.) Secrets
我在考虑使用configmaps而不是env变量,因为它们有更多的benefits。
因此,开发人员给了我用外部文件覆盖这些硬编码变量的可能性:Dsystem.properties.file = / var / foobar / environment.properties
但我仍然用外部文件覆盖硬编码文件,我对这个解决方案不满意!
因此,我基本上建议可以在外部提供这些硬编码文件,并在k8中使用configmaps填充 - 在k8世界中处理配置文件的最佳做法是什么?
Tnx,汤姆
帖子中有几个问题,但我只能解决与spring-boot相关的问题。
为spring boot app指定配置的最简单,最方便的方法是通过其内置的分析功能。正如你已经提到的,你有application.properties
。您可以根据您的使用情况创建类似的文件:application-production.properties
,application-staging.properties
,application-k8s.properties
等.Kubernetes部署不会以任何方式改变这一点。您可以通过从kubernetes设置SPRING_PROFILES_ACTIVE
env变量来控制要选择的配置。
你可能有这样的事情:
docker run -e SPRING_PROFILES_ACTIVE=k8s -d -p 0.0.0.0:8080:8080 \
--name=yourapp your_image_name bash -c "java -jar yourapp.jar"
它将从application-k8s.properties
中选择配置。
Spring .properties
配置也支持环境变量。您可以使用这样的占位符:${YOUR_DB}
在您的属性文件中,spring将自动获取名为YOUR_DB
的env变量。使用此功能很方便,假设您的应用程序窗格必须有自己的数据库窗格。
如果我的问题正确,您就会问如何通过k8s ConfigMap配置Spring Boot应用程序。是的,你可以这样做。