Dockerizing Spring boot 应用程序以进行 Kubernetes 部署

标签 docker spring-boot kubernetes

我的 application.properties 中有一个带有以下属性的 Spring Boot 应用程序。

server.ssl.keyStore=/users/admin/certs/appcert.jks
server.ssl.keyStorePassword=certpwd
server.ssl.trustStore=/users/admin/certs/cacerts
server.ssl.trustStorePassword=trustpwd

在这里,证书路径被硬编码到某个路径。但是,我不想硬编码,因为路径在 Mesos 或 Kubernetes 世界中是未知的。

我有一个docker文件如下。
FROM docker.com/base/jdk1.8:latest

MAINTAINER Application Engineering [ https://docker.com/ ]

RUN mkdir -p /opt/docker/svc

COPY application/weather-service.war /opt/docker/svc/

CMD java -jar /opt/docker/svc/weather-service.war --spring.config.location=file:/conf/application.properties -Dlogging.config=/conf/logback.xml

在这里,我可以使用 kubernetes 中的卷挂载选项来放置 application.proerties。

我如何才能为 application.properties 中的证书文件实现相同的功能?

在这里,证书 Prop 对于少数应用程序是可选的,对于少数应用程序是强制性的。

我需要在 docker 镜像中集成并将证书文件放在 docker 镜像之外的选项。

方法 1 .在 docker 镜像中

从 application.properties 中删除属性“server.ssl.keyStore”并将其作为环境变量传递,如下所示。

CMD java -jar /opt/docker/svc/weather-service.war --spring.config.location=file:/conf/application.properties -Dlogging.config=/conf/logback.xml -Dserver.ssl.keyStore=/certs/appcert.jks



现在,证书应该放在 secret 中,并在 kubernetes 中使用卷挂载选项。

方法二 .不需要在 docker 文件中包含 -Dserver.ssl.keyStore=/certs/appcert.jks,但仍然从 application.properties 中删除属性“server.ssl.keyStore”并执行以下操作。

一种。创建 secret

kubectl create secret generic svc-truststore-cert --from-file=./cacerts



湾。如下创建一个环境变量。

{ "name": "JAVA_OPTS", "value": "-Dserver.ssl.trustStore=/certs/truststore/cacerts" }



C。在容器下为 pod 创建卷挂载。

"volumeMounts": [ { "name": "truststore-cert", "mountPath": "/certs/truststore" } ]



d。在规范下创建一个卷。

{ "name": "truststore-cert", "secret": { "secretName": "svc-truststore-cert", "items": [ { "key": "cacerts", "path": "cacerts" } ] } }



方法 3 .

使用 Kubernetes 持久卷。

在 Kubernetes 上创建了一个持久卷。

将卷挂载到每个微服务的 Pod(pod 脚本文件中的更改)。已挂载的文件系统可通过 - '/shared/folder/certs' 路径访问。

CMD java -jar /opt/docker/svc/weather-service.war --spring.config.location=file:/conf/application.properties -Dlogging.config=/conf/logback.xml -Dserver.ssl.keyStore=/certs/appcert.jks



我采取了第二种方法。它是否正确?还有其他更好的方法吗?

谢谢

最佳答案

是的,第二种方法是最好的方法,如果您要存储一些敏感数据,如证书、 key 等,它是唯一的方法。该主题在 documentation 中进行了介绍。 .

此外,您可以encrypt您的 secret ,以增加另一层保护。

关于Dockerizing Spring boot 应用程序以进行 Kubernetes 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49566001/

相关文章:

kubernetes - Minikube 无法启动,kubectl 与服务器的连接被拒绝

docker - 有没有办法获得docker stats的快照?

json - Spring 靴泽西 jackson

spring-boot - Thymeleaf:语言选择器的 Switch 语句

spring-boot - 如何使用 Spring Boot 嵌入式 tomcat 设置 Tomcat session 复制

kubernetes - 找出集群中使用 ConfigMap 值的位置

docker 本地注册表 "exec:\"htpasswd\": executable file not found in $PATH"

Docker:与手动逐步构建相比,构建结果不同

docker - kube-dns 无法解析 'kubernetes.default.svc.cluster.local'

azure - 将应用程序部署到 Azure Kubernetes 服务失败。我的全局管理员帐户缺少权限/范围