我的 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/