在kubernetes中部署启用了https的Spring Boot Rest Service

时间:2018-07-19 19:23:16

标签: docker spring-boot kubernetes

我已经开发了基于Spring Boot的REST API服务,并使用自签名证书密钥库(在本地进行测试)在其上启用了https,并且效果很好。

server.ssl.key-store=classpath:certs/keystore.jks
server.ssl.key-store-password=keystore
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat

现在,我想打包docker映像并将此服务部署在kubernetes集群中。我知道我可以将服务公开为NodePort并从外部访问它。

我想知道的是,我怀疑在kubernetes集群中部署时,在本地计算机上生成的自签名证书是否可以正常工作。我研究并找到了一些使用kubernetes入口,kubernetes机密等的解决方案。我对执行此操作的最佳方式感到困惑,以便可以通过https访问在kubernetes中运行的服务。我需要对我的REST API代码进行哪些更改?

更新后的注释:尽管我已将自签名证书用于测试目的,但仍可以从公司获得CA签名证书并将其用于生产。我的问题更多是针对以下方面:对于已经使用基于SSL / TLS的连接的REST API服务,在kubernetes集群中部署和访问证书的更好的方法有哪些,例如:在应用程序本身中打包,使用机密,或废弃应用程序的SSL配置并改用Ingres,等等。希望我的问题有意义:)

谢谢您的建议。

1 个答案:

答案 0 :(得分:1)

嗯,这取决于您要公开服务的方式。基本上,您可以选择一个入口,一个外部负载均衡器(仅在某些特定的云环境中可用)或一个路由到端口(通过NodePort或HostPort)的服务。

注意:我们的K8S群集是自托管的,因此我没有关于K8S中外部负载均衡器的可靠信息,因此将省略该选项。

如果您想将服务直接暴露在端口80(例如https://app.myorg.org)上的某个域的后面,则需要使用入口。但是,如果您不需要它,并且可以使用特定端口,则NodePort方法应该可以解决问题(例如https://one.ofyourcluster.servers:30000/)。

让我们假设您要尝试使用入口方法,而不是将证书添加到K8S中的入口定义中,而不是在Spring Boot应用程序中添加证书,或者您还必须指定入口中通过https本身可访问该服务。每种控制器的执行方式可能有所不同。

对于NodePort / HostPort,您只需要在应用程序中启用SSL。

尽管您还需要有效的证书,例如由https://letsencrypt.org/发布 实际上,对于K8S,如果您使用入口,有些项目可以自动为您获取letencrypt证书。 (例如https://github.com/jetstack/cert-manager/