如何在springboot应用程序yaml中注入部署yaml env变量

时间:2021-07-20 11:43:52

标签: spring spring-boot kubernetes environment-variables

我正在尝试将 Kubernetes 的部署 yaml 中声明的环境变量读取到 springboot application.yaml 中

以下是 deployment.yaml 中的示例

    spec:
      containers:
        env:
        - name: SECRET_IN
          value: dev

以下是 application.yaml 中的示例

    innovation:
      in: ${SECRET_IN:demo}

但是在本地主机上,当我尝试打印innovation.in(正确创建@Configuration)时,我没有在输出中得到“dev”,它总是打印demo,它出现了部署之间的链接,应用程序 yaml 没有发生,有人可以帮忙吗。

2 个答案:

答案 0 :(得分:1)

您可以将整个 application.YAML 配置文件存储到 config mapsecret 中,并仅将其与部署一起注入

例如:

kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  application.yaml: |-
    pool:
      size:
        core: 1
        max:16

如果您的 application.properties 类似于

示例:

spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/dbname
spring.datasource.username=user
spring.datasource.password=password

您可以将其替换为

jdbc:mysql://${MYSQL_HOST:localhost}:3306/dbname

Deployment.yaml 将类似于

spec:
      containers:
      - name: demowebapp
        image: registry.gitlab.com/unicorn/unicornapp:1.0
        ports:
        - containerPort: 8080
        imagePullPolicy: Always
        env:
          - name: MYSQL_HOST
            value: mysql-prod

您也可以根据需要将更多配置保存到配置映射秘密中。

阅读更多信息:https://pushbuildtestdeploy.com/spring-boot-application.properties-in-kubernetes/

答案 1 :(得分:1)

我认为你做的一切都对,我有类似的工作设置,但没有默认的“演示”。

从 Spring Boot 的角度进行的一些说明可能会有所帮助。

  1. application.yml 可以包含确实可以从环境变量解析的占位符。
  2. 确保在编译 Spring Boot 应用程序工件期间,此 application.yml 未“更改”(重写,由 Maven 过滤)。
  3. 最重要的是:spring boot 对 k8s 设置一无所知。如果环境变量存在 - 它会选择它。因此,即使在本地也可以检查相同的内容 - 定义 env。本地计算机上的变量并运行 Spring Boot 应用程序。
  4. 有可能在应用程序运行时(与用户/组一起)无法访问环境变量 - 在启动 spring 启动应用程序之前通过打印环境变量(或这个特定的)来检查它。或者你可以在java的main方法中完成:
Map<String, String> env  = System.getenv();
env.entrySet().forEach(System.out::println);