java应用程序在kubernetes中的应用程序configuration

我是新来的Java和K8,我对如何处理我的Java应用程序的应用程序configuration有一些怀疑。 我有一个春季启动应用程序,其他三个使用野蛮。

所以,他们都得到了硬编码的应用程序configuration,启动它们时只需使用如下所示:

java -Dswarm.project.stage=development -jar foobar/target/foobar-swarm.jar 

除了具有由应用程序configuration数据组成的application.properties文件的spring启动。

所以基本上这三个Java应用程序已经支持两个文件(我知道是不是):

  - project-stages.yml - standalone.xml 

而当开发人员想要部署到生产时,他使用:

  java -Dswarm.project.stage=production -jar foobar/target/foobar-swarm.jar 

而现在我们来到kubernetes,它有三种处理应用程序configuration数据的方式:

 1.) Env variables 2.) Config maps 3.) Secrets 

我正在考虑使用configmaps而不是envvariables,因为它们有更多的好处 。

所以,开发人员给了我用外部文件覆盖这些硬编码variables的可能性: Dsystem.properties.file = / var / foobar / environment.properties

但是我仍然用外部文件覆盖硬编码的文件,而且我对这个解决scheme不满意!

所以,我基本上看在build议可以这些硬编码的文件提供外部和填充configuration文件在K8 – 什么是处理在K8世界的configuration文件的最佳做法?

Tnx,Tom

这个post中有几个问题,但我只能解决与spring-boot有关的问题。

指定configuration到弹簧启动应用程序的最简单和最方便的方式是通过其内置的configuration文件function。 正如你已经提到你有application.properties 。 您可以根据您的使用情况创build类似的文件: application-production.propertiesapplication-staging.propertiesapplication-k8s.properties等。Kubernetes部署不会以任何方式更改。 您可以通过从kubernetes设置SPRING_PROFILES_ACTIVE envvariables来控制select哪个configuration。

你可能有这样的事情:

 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.propertiesselectconfiguration。

Spring .propertiesconfiguration也支持环境variables。 你可以在你的属性文件中有这样的占位符: ${YOUR_DB} ,spring会自动select名为YOUR_DB envvariables。 使用这个function很方便,比如说你的应用程序窗口必须有自己的db窗格。

如果我的问题得到了解决,您正在问如何通过k8s ConfigMapconfigurationSpring Boot应用程序。 是的,你可以这么做。

  1. 用WORKDIR work_dir创build一个Docker镜像,在其中启动Spring Boot应用程序,例如通过java -jar /work_dir/app.jar
  2. 创build一个ConfigMap
  3. 在k8s内运行上述图像的容器
  4. 将Spring Boot的application.properties的ConfigMap挂载到容器中,作为/work_dir/config/application.properties
  5. ConfigMap中的更改会更新容器中的文件。 您必须重新启动Spring Boot应用程序才能将您的更改设置为活动状态。