如何使用 JWT 和 Kubernetes 设置 Spring 后端
Posted
技术标签:
【中文标题】如何使用 JWT 和 Kubernetes 设置 Spring 后端【英文标题】:How to setup Spring backend with JWT and Kubernetes 【发布时间】:2019-08-24 00:03:53 【问题描述】:我实现了一个 Spring 后端,它负责存储不同的数据(用户、讲座等)。该后端由 JWT 保护,一切正常。对于我的学习,我想增强后端,现在我想使用微服务架构而不是单体。为此,我有使用 Docker 和 Kubernetes 的要求。当我想在微服务架构中使用 JWT 时,我总是阅读一些文章,其中写到我需要一个授权服务器和一个资源服务器。那是对的吗?我是否需要一个网关(例如 Zuul)来实现我的目的?有人可以帮助我构建项目并为技术堆栈提供建议。最后,整个项目将在一台服务器上运行。
我实现了一个 molotithical 后端,由 JWT 保护。
【问题讨论】:
【参考方案1】:Kubernetes 官方支持通过OpenID Connect 工具使用 OAuth 2.0 协议对 JSON Web Tokens(JWT) 内的 API 服务器进行authentication 用于用户请求识别。但是,这仅代表Authorization 模型的一部分,它决定了如何为经过身份验证的用户授予适当的安全策略或角色来管理 Kubernetes 集群资源。
为了构建应用程序或将应用程序迁移到 Kubernetes,您可能会考虑将应用程序暴露在集群之外,为此,Ingress 代理请求通过匹配请求路径来精确服务。实际上,Ingress
是一个逻辑资源元素,它描述了一组通过Ingress Controller 进行流量管理的规则。因此,Ingress 控制器可以通过提供 L7 网络设施来扮演 API 网关的角色,例如:负载均衡、SSL 终止和嵌套应用服务的 HTTP/HTTPS 流量路由。
正如您提到的,Zuul 网关可以是 Kubernetes 集群前面的边缘代理服务的选项之一,但是我建议寻找更多面向 Kubernetes 的解决方案。 Istio 就是一个很好的例子,因为它带来了广泛的网络路由器功能,并通过其核心 Service mesh 设计非常简单地集成到 Kubernetes 集群中。 Istio 在声明的身份验证 policy 中通过 JWT 提供最终用户身份验证。
或者,您也可以通过已宣布的 JWT 身份验证来使用 nginx plus 功能。
【讨论】:
非常感谢!但这是一个如此复杂的话题。正如您提到的,后端可能如下所示:每个微服务的 Spring Boot。然后,每个微服务(lecture-service,...)都将使用 Docker 进行容器化,Kubernetes 将处理集群。作为网关,我将使用 Ingress。对于微服务之间的通信,我可以使用 Ribbon 或 RestTemplate(这是正确的吗?)。为了安全起见,我可以使用 OpenID Connect 或 Istio。两者都使用 jwt。对于可靠的微服务架构来说,这是一个很好的技术堆栈吗?我是否考虑了所有必要的因素? 同一个Kubernetes集群内不同服务之间的通信是通过CNI网络plugins组织的,Ingress可以替换为Istioistio-ingressgateway
。以上是关于如何使用 JWT 和 Kubernetes 设置 Spring 后端的主要内容,如果未能解决你的问题,请参考以下文章
如何使用基于网站的 ExpressJs 设置 CORS 和 JWT 令牌验证