繁体   English   中英

如何在 kube.netes 上部署前端以及这如何与 AWS Cloudfront 一起使用?

[英]How to deploy frontends on kubernetes and how this can work with AWS Cloudfront?

我有两个前端,一个是基于 VueJS 的,另一个是传统的服务器端渲染前端。 这两个前端都使用 cookies 来识别用户,用户数据存储在 MongoDB 上。我想部署一个前端的 2 个或多个实例(供公众使用)和另一个前端的一个实例(仅供员工使用)。

我还想通过 AWS Cloudfront 部署面向公众的前端 static 资产。

如何部署到 Kube.netes 上述场景? 我是否将前端部署到 Kube.netes 中的多个 Pod?

我是否将 Cloudfront 部署到 Kube.netes 上的 Pod?

如果我使用 AWS 托管的 Kube.netes、EKS,上述情况是否有任何变化?

如何在 AWS Cloufront 上部署动态资产(从 MongoDB 数据库中提取)?

Java Spring Boot API 后端使用 OAuth 2 来验证用户(在 VueJS 前端登录表单上)。 VueJS 前端使用 JWT 访问/刷新令牌,而 Spring Boot 前端在其后端使用固定的 API 用户向 API 后端发出 API 请求以获取要显示给客户的内容。

好像有一些误会,所以让我先澄清几件事:

AWS Cloudfront 是一个内容分发网络 (CDN),与 Kube.netes 无关。 AWS 在世界各地部署了很多服务器,这些服务器可以简单地复制您想要与客户共享的任何 static 内容(例如徽标、常见问题解答等)。 通过将其复制到世界几乎每个角落,无论您的客户身在何处,他们附近都会有其中一台服务器,这会为他们带来更快的加载时间,因为他们不必与另一端的服务器通信世界。

我是否将 Cloudfront 部署到 Kube.netes 上的 Pod?

因此,不在 Kube.netes 上部署 Cloudfront。 您所要做的就是告诉 Cloudfront 您的原始服务器,它基本上就是您的 static 资产所在的位置。 大多数情况下,最简单的方法是将这些资产放在 S3 存储桶中。 由于这部分有很好的文档,我不会在这里复制每一步。 “如何开始使用 Amazon CloudFront”站点特别指导您逐步完成 Cloudfront 的设置和配置。

现在关于 Kube.netes:

Kube.netes 是一个容器编排器。 这听起来比实际更复杂。 从本质上讲,这意味着它将为您管理容器,即重启失败的容器、它们之间的负载平衡等等。 容器被定义为 Pod 的一部分。 虽然在一个 Pod 中有多个容器是可能的(并且对于某些架构模式是必要的),但大多数情况下 Pod 和容器之间的比例是 1:1。 因此,每个应用程序通常都会部署在自己的 Pod 中,并由一个容器组成。

如何部署到 Kube.netes 上述场景? 我是否将前端部署到 Kube.netes 中的多个 Pod?

这取决于您没有提供太多信息的应用程序(除了提及 VueJS)。 在大多数情况下,VueJS 非常适合在 CDN 上部署,因为它只是 static javascript。因此,除非有特定原因不将它们部署在 CDN 上,否则没有理由将它们部署到 Kube.netes 上。

但是,如果出于某种原因必须将其部署在 Kube.netes 上,只需创建一个Deployment即可。 Deployment 是一个 Kube.netes object,它为您创建(ReplicaSets,然后依次创建)Pod。 创建 Deployment 时(这只是一个 YAML 文件,您使用kubectl apply -f <your-file>发送给 Kube.netes),您告诉它 Pod 的外观,Kube.netes 将为您处理 rest。 创建 Pod 后,它们只能从 Kube.netes 集群中访问。 要将它们暴露给外界,有两种选择:

如果我使用 AWS 托管的 Kube.netes、EKS,上述情况是否有任何变化?

使用托管的 Kube.netes(例如 EKS)是迄今为止最简单的方法,因为它可以自动为您创建具有公共 IP 地址的负载均衡器。 如果有什么使用 EKS 会使事情变得更复杂的话。 然后你将不得不自己管理你的 LoadBalancer 和/或 Ingress(自己设置一切,维护它,......)。

您在这里问的是架构设计问题,并且有优化云托管的先决条件。 简而言之,您需要非常严格地分离 Web 和 API 关注点

单页应用程序

Web static 内容应通过内容分发网络 (CDN) 部署到例如全球 50 个位置。 在这里使用容器通常是矫枉过正,像 AWS Cloudfront 这样的系统将在全球范围内实现 web 次下载的同等性能,而无需付出太多技术努力。

Cookie 后端

这些需要运行时,因此如果您使用网站技术,例如 Spring Boot,您将无法以首选方式使用 CDN。 AWS Cloudfront 仅托管 static 内容,不托管运行时。

蜜蜂

通常首选使用 Kube.netes 部署 API 和其他后端组件,以保持代码的可移植性,并在 API 旁边托管同类最佳的支持组件。

令牌处理模式

API 可以为单页应用程序执行 cookie 发布,而不需要网站后端。 这很棘手,但请参阅本文以了解其工作原理的概述。

动态资产

在这个 model 中,任何需要保护的东西都最好通过 API 而不是 Cloudfront 进行管理。 动态图像等可以随时推送到 Cloudfront。 如果您有特殊原因,也可以将 API 发出 cookies 发送到 Cloudfront,并在 lambda 边缘功能中使用它们。

我的例子

我的单页应用程序仅在浏览器中使用最新的安全 cookies,并且还通过 Cloudfront 进行部署 - 您可以运行在线版本,并附带一些博客文章。

我还有一个端到端 SPA + API Kube.netes 存储库,我将在今年晚些时候将它的 API 相关部分部署到 EKS。 在开发计算机上,web static 内容是通过运行 Express web 服务器的容器提供的,尽管我在部署到 EKS 时将使用 Cloudfront 作为 web 主机。

概括

为 web 应用程序启用最佳云托管需要付出努力,部分原因是当前的安全最佳实践是 SPA 仅在浏览器中使用最新的安全 cookies。

您将不得不为网站使用容器托管,并且如果最适合您当前的架构,您可以选择将其用于 SPA。 不过,通过努力,可以将 Cloudfront 用于受 cookies 保护的 SPA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM