为Kubernetes部署Dockerizing Spring启动应用程序

时间:2018-03-29 22:33:47

标签: 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世界中不会知道这条路径。

我有一个泊坞文件如下。

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中使用volume mount选项,以便放置application.proerties。

如何在application.properties中为cert文件实现相同的功能?

此处,证书道具对于少数应用程序是可选的,对于少数应用程序是强制性的。

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

方法1 。在泊坞窗图像中

删除属性" server.ssl.keyStore"来自application.properties并将其作为环境变量传递,如下所示。

  

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

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

方法2 。无需在docker文件中使用-Dserver.ssl.keyStore = / certs / appcert.jks,但仍然删除属性" server.ssl.keyStore"来自application.properties并执行以下操作。

一个。创建秘密

  

kubectl创建秘密通用svc-truststore-cert   --from文件=。/ cacerts中

湾创建一个env变量,如下所示。

  

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

℃。在pod的容器下创建卷安装。

  

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

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

  

{               " name":" truststore-cert",               "秘密":{                 " secretName":" svc-truststore-cert",                 "项目":[                   {                     " key":" cacerts",                     "路径":" cacerts"                   }                 ]               }             }

方法3

使用Kubernetes Persistent Volume。

在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

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

由于

1 个答案:

答案 0 :(得分:0)

是的,第二种方法是最好的方法,如果您要存储一些敏感数据,如证书,密钥等,这是唯一的方法。documentation中涵盖了该主题。

此外,您可以encrypt保密,以增加其他级别的保护。