【问题标题】:Decoupling DB connection strings from spring boot api (K8s, Docker, Spring, Java)将数据库连接字符串与 spring boot api(K8s、Docker、Spring、Java)解耦
【发布时间】:2020-07-22 17:39:06
【问题描述】:

问题:我有一个非常简单的带有硬编码数据库连接字符串的 spring boot api。我想从我的 K8s 集群中的一个 pod 提供这些连接字符串,但是我在告诉 api 从 env 变量中读取时遇到了问题。

我的 Dockerfile:

FROM gcr.io/distroless/java:8
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这是 db-secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
data:
  host: XXXX
  user: XXXX
  password: XXXX
  database: XXXX

这是我的 api pod 我的部署文件的 env 部分:

          env:
            - name: ORIGIN
              value: https://myclient.app.com
            - name: HOST
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: host
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: password
            - name: USERNAME
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: user
            - name: DATABASE
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: database

这是我的 Java application.properties 文件:

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=${HOST}/"todos"
spring.datasource.username=${USERNAME}
spring.datasource.password=${PASSWORD}

但是...当我尝试使用 ./mvnw clean package 构建应用程序时,我得到: * java.lang.IllegalStateException: 无法加载 ApplicationContext * BeanCreationException:创建名为“entityManagerFactory”的bean时出错

我尝试通过命令行导出变量,但没有奏效。我知道节点有 process.env.SOME_VAR。 Java有这样的东西吗?我已经梳理了一段时间的互联网并尝试了不同的解决方案,但目前没有太多工作。

【问题讨论】:

  • 您的构建失败,因此您甚至还没有到达 Kubernetes 集群,因此您的问题可能与其他问题有关。如果你直接注入你的凭据和 URL,你仍然有同样的错误吗?此外,该错误消息必须继续存在,说明无法创建 entityManagerFactory 的原因。可以查一下吗?
  • 您是否按照本文所述配置您的秘密:developers.redhat.com/blog/2017/10/04/…

标签: java spring spring-boot kubernetes dockerfile


【解决方案1】:

加载环境变量需要一些配置,否则不会有任何东西在寻找db-secret.yaml 文件。

一种方法是将配置值直接放入application.propertiesapplication.yml。您可能还需要确保这些文件没有提交到存储库中(例如,添加到 .gitignore)。

【讨论】:

  • 所以我的 K8s 集群中有一个正在运行的 pod,它获取 db-secret.yaml 的内容并注入到托管我的 spring boot api 的容器中。如果这是一个节点 api,我可以从 process.env.DB_HOST 中读取。我想我在运行的 pod 和运行的容器之间缺少了一些东西。也许容器没有正确构建?我不知道。我需要从 pod => 容器 => 应用程序代码中获取信誉...我还没有找到方法:(
猜你喜欢
  • 2020-02-26
  • 1970-01-01
  • 2019-10-08
  • 2021-12-11
  • 1970-01-01
  • 2020-07-07
  • 2018-07-21
  • 2018-10-10
  • 2022-10-02
相关资源
最近更新 更多