docker - 在 kubernetes 中部署启用 https 的 Spring Boot Rest 服务

标签 docker spring-boot kubernetes

我开发了一个基于 Spring Boot 的 REST API 服务,并通过使用自签名证书 keystore (在本地测试)在其上启用了 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 secret 等的解决方案。我很困惑什么是最好的方法,这样我就可以通过 https 访问在 kubernetes 中运行的服务。我需要对我的 REST API 代码进行哪些更改?

更新说明 : 虽然我使用自签名证书进行测试,但我可以从我的公司获得 CA 签名证书并将其用于生产。我的问题更多的是,对于已经使用基于 SSL/TLS 的连接的 REST API 服务,在 kubernetes 集群中部署和访问证书的更好方法是什么,例如:在应用程序本身中打包,使用 secret ,或废弃应用程序的 SSL 配置并改用 Ingres 等。希望我的问题有意义 :)

感谢您的任何建议。

最佳答案

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

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

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

假设您想尝试入口方法,而不是需要将证书添加到 K8S 中的入口定义而不是 Spring Boot 应用程序,或者您必须另外指定该服务可通过入口中的 https 本身访问。执行此操作的方式可能因入口 Controller 而异。

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

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

关于docker - 在 kubernetes 中部署启用 https 的 Spring Boot Rest 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51430395/

相关文章:

Docker 镜像随着时间的推移而消失

java - 如何将 2 个服务器作为单独的进程运行?

logging - GKE-堆栈驱动程序

docker - 我无法启动 minikube

windows - 在与主(和主机)不同的操作系统上运行 Jenkins 从属

docker - Dockerfile在入口点执行其他脚本

python - 使用 SSH 从 BitBucket pip 安装自定义包,无需在 Docker 构建期间输入 SSH 密码

java - 自 Spring Boot 升级以来,结合 @ConditionalOnMissingBean 定义 Bean 不起作用

java - 将 Spring Boot 与 Neo4J 结合使用 : Updating node creates duplicate node

kubernetes - 访问 kubernetes pod 容器内的内置 etcd