我有一个 Spring Boot 应用程序,在我的 application.properties 中具有如下一些属性。
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 中为证书文件实现同样的效果?
在这里,cert 属性对于少数应用程序是可选的,而对于少数应用程序是必需的。
我需要在 docker 镜像中集成的选项,并将证书文件放在 docker 镜像之外。
方法一。在 docker 镜像内
从 application.properties 中删除属性“server.ssl.keyStore”并将其作为环境变量传递,如下所示。
CMD java -jar /opt/docker/svc/weather-service.war
--spring.config.location=文件:/conf/application.properties -Dlogging.config=/conf/logback.xml -Dserver.ssl.keyStore=/certs/appcert.jks
现在,证书应该保密,并使用 kubernetes 的卷安装选项。
方法2。无需在 docker 文件中包含 -Dserver.ssl.keyStore=/certs/appcert.jks,但仍从 application.properties 中删除属性“server.ssl.keyStore”并执行以下操作。
A。创造秘密
kubectl 创建秘密通用 svc-truststore-cert
--from-file=./cacerts
b.创建一个环境变量,如下所示。
{
“名称”:“JAVA_OPTS”,
“值”:“-Dserver.ssl.trustStore=/certs/truststore/cacerts”
}
C。在容器下为 pod 创建 Volume 挂载。
“卷安装”:[
{
“名称”:“信任库证书”,
“挂载路径”:“/证书/信任库”
}
]
d.根据规格创建一个卷。
{
“名称”:“信任库证书”,
“秘密”: {
"secretName": "svc-truststore-cert",
“项目”: [
{
“密钥”:“证书”,
“路径”:“证书”
}
]
}
}
方法3.
使用 Kubernetes 持久卷。
在 Kubernetes 上创建持久卷。
将卷挂载到每个微服务的 Pod(Pod 脚本文件中的更改)。可通过“/shared/folder/certs”路径访问已安装的文件系统。
CMD java -jar /opt/docker/svc/weather-service.war
--spring.config.location=文件:/conf/application.properties -Dlogging.config=/conf/logback.xml -Dserver.ssl.keyStore=/certs/appcert.jks
我采取了第二种方法。它是否正确?还有其他更好的方法吗?
Thanks