8

我一直在四处寻找是否可以将静态 React 应用程序托管在 Google Cloud Storage 存储桶中,并使用 Google Cloud CDN 和单个 Google Cloud Load Balancer 将缓存未命中路由到存储桶,管理证书,并将来自 React 应用程序的内部请求路由到托管在 GKE 中的 API?

是否有可能实现这种架构,或者是否有另一种推荐的方法?

4

2 回答 2

6

您可以拥有一个带有(两个或更多)路由匹配器的负载均衡器,一个用于 api.example.com 并带有 GKE 的后端,另一个用于带有后端存储桶的 static.example.com。

此后端存储桶将启用 CDN。如果需要,您可以将多条路由指向同一个后端。

具体来说:

  1. 创建一个由独立网络端点组表示的 Kubernetes 服务。这将允许您在 GKE 之外管理负载均衡器。文档:https ://cloud.google.com/kubernetes-engine/docs/how-to/standalone-neg

  2. 创建一个 HTTP(S) 负载均衡器,其中包含您希望与 API 端点匹配的路由。在负载均衡器创建流程中创建一个 BackendService,并将其指向您在步骤 #1 中创建的现有区域网络端点组。文档:https ://cloud.google.com/load-balancing/docs/https/https-load-balancer-example

  3. 在同一流程中创建一个 BackendBucket,将其指向您要用于存储静态 React 资产的存储桶。确保勾选“启用云 CDN”框并创建将流量发送到该存储桶的路由。文档:https ://cloud.google.com/cdn/docs/using-cdn#enable_existing

  4. 完成创建 LB,它将分配 IP 地址,并为您的域名更新 DNS 以指向这些 IP。

于 2020-03-01T03:04:19.827 回答
2

这种方法首先要考虑的是,CDN 位于负载均衡器的前面,而不是相反。这意味着在 CDN 中不涉及路由。路由是在 CDN 缓存请求内容后完成的。

除此之外,CDN仅在第一次缓存未命中后才开始缓存内容。这意味着只有在客户端请求该资源后,它才需要第一次获取该资源。

如果资源尚未缓存在 CDN 中,那么它将被路由到后端(通过负载均衡器),以便检索它并制作“本地副本”。当然,这要求资源也存在于后端,以便 CDN 缓存它。

您的方法似乎假设 CDN 将充当不同类型的持久层,所以我相信它仍然是可能的,但不是使用 Cloud CDN 而是使用 Cloud Storage bucket

由于存储桶具有多区域类,因此您可能能够实现与您使用 CDN 尝试的非常相似的东西。

更新:

考虑新的前提:使用相同的负载均衡器在托管在 GCS 存储桶中的静态站点和部署在 GKE 中的 API 之间路由请求,前面有 CDN 并支持证书

虽然HTTP(S) 负载均衡器可以管理证书,与 Cloud CDN 兼容,可以将存储桶或 GCE 实例作为后端,并且是 GKE 中的默认 [Ingress] 选项(因此它也与之兼容),但这种方法并不t 似乎可行。

当您使用部署这种负载均衡器的默认入口类 (GCE)在 GKE 上公开应用程序时,GKE云控制器管理器负责该资源并依赖于部署到 GKE 的定义。

如果您尝试手动管理负载均衡器以添加新的后端,在您的情况下,包含您的静态应用程序的存储桶,如果将新版本的 Ingress 部署到集群,则更改可能会被撤销。

在相反的情况下,您手动创建负载均衡器并配置其后端以提供存储桶的内容:不支持将此负载均衡器附加到 GKE 集群,它必须在 Kubernetes 中创建。

因此,简而言之:您要么将负载均衡器与存储桶一起使用,要么与 GKE 集群一起使用,由于上述设计,不能同时使用两者

如果您部署 2 个不同的负载均衡器(ingress就 GKE 而言)并将您的 CDN 与存储桶一起放在负载均衡器的前面,这当然是完全可能的。我提到这一点是为了与上面的信息进行对比。

让我知道这是否有帮助:)

于 2020-02-28T12:12:57.317 回答