使用相同的 GCP 负载均衡器在 GCS 存储桶和 GKE 之间进行路由

Posted

技术标签:

【中文标题】使用相同的 GCP 负载均衡器在 GCS 存储桶和 GKE 之间进行路由【英文标题】:Use same GCP Load Balancer to route between GCS bucket and GKE 【发布时间】:2020-06-12 03:50:47 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

具体来说:

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

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

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

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

【讨论】:

感谢您的详细解释。我将尝试一下,并根据我的经验更新一些背景信息。顺便说一句,#2 中的链接已损坏。 修复了链接(反对在手机上回答的教训!) 如果你有这个教程,我很难让这一切正常工作。【参考方案2】:

使用这种方法首先要考虑的是the CDN sits in front of the load balancer,而不是相反。这意味着在 CDN 中不涉及路由。路由是在内容被 CDN 缓存请求之后完成的。

除此之外,CDN 开始缓存内容only after the first cache miss。这意味着只有在客户端请求资源后,它才需要第一次获取资源。

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

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

由于存储桶有multi-regional classes,您可能能够实现与您正在尝试使用 CDN 非常相似的东西。

更新:

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

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

当您使用部署此类负载均衡器的default ingress class (GCE) 在 GKE 上公开应用程序时,GKE cloud controller manager 负责该资源并依赖于部署到 GKE 的定义。

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

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

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

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

如果这有帮助,请告诉我:)

【讨论】:

你说得对,我完全忘了提到存储静态 React 应用程序的 Google Cloud Storage 存储桶。我需要该站点是 HTTPS,因此仅在 Google Cloud Storage 存储桶中托管不会削减它。在这种情况下,我需要一个 Google Cloud Load Balancer 来管理证书。所以我的问题真的是我是否能够将相同的 LB 用于缓存未命中和托管在 GKE 中的内部 API? 这是有道理的,我只是希望通过只拥有一次 LB 来降低成本。此外,我还不清楚路由是如何工作的,因为我认为 LB 必须具有唯一的静态 IP。我想我只需要将 api 放在子域中?这听起来对吗@yyyyahir? 这个答案离 Cloud CDN 支持路由作为负载均衡器的一部分还有很长的路要走。多区域存储桶与 CDN 不同。 我已经发布了一个答案,解决了其中的一些错误以及如何创建一个指向 GKE 后端 + 启用 Cloud CDN 的存储桶的独立 LB。 (我是我们 CDN 的 PM,并将其作为一项行动项目,为此类设置提供更好的“单页”教程)。

以上是关于使用相同的 GCP 负载均衡器在 GCS 存储桶和 GKE 之间进行路由的主要内容,如果未能解决你的问题,请参考以下文章

GCP 云存储(GCS)新对象/更改通知到电子邮件/文本,消息

是否可以在没有域命名的情况下为 GCS 存储桶设置索引文件?

terraform GCP https) 负载均衡器

在GCP负载均衡器后面设置自动缩放弹性搜索

如何在 GCP 上的 TCP 负载均衡器上获取当前连接数

将 kubernetes(GKE) 服务层指标发送到 GCP 负载均衡器