kubernetes中java应用程序的应用程序配置

kubernetes中java应用程序的应用程序配置,java,docker,configuration,kubernetes,Java,Docker,Configuration,Kubernetes,我是java和k8新手,我对如何处理java应用程序的应用程序配置有些怀疑。我有一个spring boot应用程序,另外三个使用wildfly 因此,它们都有硬编码的应用程序配置,在启动它们时,只需使用如下内容: java -Dswarm.project.stage=development -jar foobar/target/foobar-swarm.jar 除了spring引导,它有一个包含应用程序配置数据的application.properties文件 因此,基本上这三个java应用程

我是java和k8新手,我对如何处理java应用程序的应用程序配置有些怀疑。我有一个spring boot应用程序,另外三个使用wildfly

因此,它们都有硬编码的应用程序配置,在启动它们时,只需使用如下内容:

java -Dswarm.project.stage=development -jar foobar/target/foobar-swarm.jar
除了spring引导,它有一个包含应用程序配置数据的application.properties文件

因此,基本上这三个java应用程序支持两个文件(我知道这是一个禁忌):

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

  java -Dswarm.project.stage=production -jar foobar/target/foobar-swarm.jar
现在我们来看kubernetes,它有三种处理应用程序配置数据的方法:

1.) Env variables

2.) Config maps

3.) Secrets
我在考虑使用configmaps而不是env变量,因为它们有更多的变量

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

但是我仍然在用外部文件覆盖硬编码文件,我对这个解决方案不满意

因此,我基本上是在考虑这些硬编码文件是否可以在k8中从外部提供并使用configmaps填充-在k8世界中处理配置文件的最佳实践是什么

Tnx,
Tom

这篇文章中有几个问题,但我只能回答与spring boot相关的问题

为spring boot应用程序指定配置的最简单、最方便的方法是通过其内置的评测功能。正如您已经提到的,您有
application.properties
。您可以根据您的使用情况创建类似的文件:
应用程序生产.properties
应用程序暂存.properties
应用程序-k8s.properties
,等等。 Kubernetes部署不会以任何方式改变这一点。 您可以通过从kubernetes设置
SPRING\u PROFILES\u 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"
它将从
应用程序-k8s.properties
中选择配置

配置文件也支持环境变量。
在属性文件中可以有像
${YOUR_DB}
这样的占位符,Spring将自动拾取名为
YOUR_DB
的env变量。使用此功能很方便,比如说,当您的应用程序pod必须有自己的db pod时。

如果我没有弄错您的问题,您会问如何通过k8s ConfigMap配置Spring Boot应用程序。是的,你能做到

  • 使用WORKDIR work\u dir创建一个Docker映像,在其中启动Spring引导应用程序,例如通过java-jar/work\u dir/app.jar
  • 创建配置映射
  • 在k8s内运行上述图像的容器
  • 将Spring Boot application.properties的ConfigMap作为/work\u dir/config/application.properties装载到容器中
  • ConfigMap中的更改会更新容器中的文件。您必须重新启动Spring启动应用程序才能将更改设置为活动

  • 在此解决方案中,您必须使用docker image预打包应用程序文件
    application-k8s.properties
    ,对吗?这意味着现在你有了不同环境的docker图像?@nir我不知道你的意思。无需在应用程序级别操作图像。您需要引用应用程序中的容器(图像实例)。您可以在
    应用程序-k8s.properties
    中通过别名引用它们,这些别名来自您的部署。你也可以像我在回答中解释的那样,通过环境变量注入它们。也许我在你的建议中遗漏了一些东西,但休伯特·斯特罗比策的回答对我来说是有意义的。您的spring boot(或独立java)应用程序正在容器中启动,需要加载属性文件(application whatever.properties)。因此,您必须预先打包该属性文件,或者按照Hubert的建议装载configmap,或者让其他外部服务提供给spring boot
    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"