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

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

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

我还想通过 AWS Cloudfront 部署 public 面向前端的静态资产。

以上场景如何部署到Kubernetes?我是否将前端部署到 Kubernetes 中的多个 Pods?

我是否将 Cloudfront 部署到 Kubernetes 上的 Pods?

如果我使用 AWS 托管的 Kubernetes、EKS,上述情况有什么变化吗?

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

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

好像有些误会,我先澄清两点:

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

Do I deploy Cloudfront to Pods on Kubernetes?

因此,没有在Kubernetes上部署Cloudfront。 您所要做的就是告诉 Cloudfront 您的原始服务器,它基本上只是您的静态资产所在的位置。大多数情况下,最简单的方法是将这些资产放在 S3 存储桶中。 由于这部分有很好的文档,我不会在这里复制每一步。 "How to get started with Amazon CloudFront" site 特别指导您逐步完成 Cloudfront 的设置和配置。

现在关于 Kubernetes:

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

How do I deploy to Kubernetes above scenario? Do I deploy frontends to multiple Pods in Kubernetes?

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

但是,如果出于某种原因必须将其部署在 Kubernetes 上,只需创建一个 Deployment。 Deployment 是一个 Kubernetes 对象,它为您创建(然后依次创建 ReplicaSets)Pods。在创建 Deployment 时(这只是一个 YAML 文件,你使用 kubectl apply -f <your-file> 发送给 Kubernetes)你告诉它 Pods 会是什么样子,Kubernetes 会为你处理剩下的事情。 创建 Pods 后,它们只能从 Kubernetes 集群中访问。 要将它们暴露给外界,有两种选择:

If I use AWS managed Kubernetes, EKS, does anything change in above scenario?

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

你问的是架构设计问题,优化云托管是有前提的。简而言之,您需要对 Web 分离和 API 关注.

非常严格

单页应用程序

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

COOKIE 后端

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

APIs

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

令牌处理程序模式

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

动态资产

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

我的例子

我的 Single Page App 仅在浏览器中使用最新的安全 cookie,并且也是通过 Cloudfront 部署的 - 您可以使用在线版本 运行,以及一些随附的博客文章。

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

摘要

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

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