【问题标题】:application configuration for java apps in kubernetesKubernetes 中 Java 应用程序的应用程序配置
【发布时间】:2019-07-30 16:29:12
【问题描述】:

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

因此,它们都获得了硬编码的应用程序配置,并且在启动它们时只需使用以下内容:

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

Spring Boot 除外,它有一个包含应用程序配置数据的 application.properties 文件。

所以基本上这三个 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 中填充配置映射 - 在 k8 的世界中处理配置文件的最佳实践是什么?

Tnx, 汤姆

【问题讨论】:

    标签: java docker configuration kubernetes


    【解决方案1】:

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

    为 Spring Boot 应用程序指定配置的最简单、最方便的方法是通过其内置的分析功能。正如你已经提到的,你有application.properties。您可以根据自己的使用案例创建类似的文件:application-production.propertiesapplication-staging.propertiesapplication-k8s.properties 等。 Kubernetes 部署不会以任何方式改变这一点。 您可以通过在 kubernetes 中设置 SPRING_PROFILES_ACTIVE 环境变量来控制要选择的配置。

    你可能有这样的事情:

    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 中选择配置。

    配置文件也支持环境变量。 你可以在你的属性文件中使用像${YOUR_DB} 这样的占位符,Spring 会自动选择名称为YOUR_DB 的环境变量。使用此功能很方便,假设您的应用程序 pod 必须有自己的 db pod。

    【讨论】:

    • 在这个解决方案中,您必须使用 docker 映像预打包您的应用程序文件 application-k8s.properties 对吗?这意味着现在你有不同环境的 docker 镜像?
    • @nir 我不确定你的意思。无需在应用程序级别对图像进行操作。您需要在应用程序中引用容器(图像实例)。您通过 application-k8s.properties 中的别名引用它们,别名来自您的部署。您也可以像我在答案中解释的那样通过环境变量注入它们。
    • 可能是我遗漏了您的建议,但 Hubert Ströbitzer 的回答对我来说很有意义。您的 spring-boot(或独立 java)应用程序在容器内启动,它需要一个属性文件(application-whatever.properties)来加载。因此,您要么必须预先打包该属性文件,要么按照 Hubert 的建议安装 configmap,或者让其他一些外部服务提供给 spring-boot
    【解决方案2】:

    如果我的问题是正确的,那么您是在问如何通过 k8s ConfigMap 配置 Spring Boot 应用程序。是的,你可以这么做。

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

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2010-12-06
      相关资源
      最近更新 更多