我一直在四处寻找是否可以将静态 React 应用程序托管在 Google Cloud Storage 存储桶中,并使用 Google Cloud CDN 和单个 Google Cloud Load Balancer 将缓存未命中路由到存储桶,管理证书,并将来自 React 应用程序的内部请求路由到托管在 GKE 中的 API?
是否有可能实现这种架构,或者是否有另一种推荐的方法?
我一直在四处寻找是否可以将静态 React 应用程序托管在 Google Cloud Storage 存储桶中,并使用 Google Cloud CDN 和单个 Google Cloud Load Balancer 将缓存未命中路由到存储桶,管理证书,并将来自 React 应用程序的内部请求路由到托管在 GKE 中的 API?
是否有可能实现这种架构,或者是否有另一种推荐的方法?
您可以拥有一个带有(两个或更多)路由匹配器的负载均衡器,一个用于 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。
这种方法首先要考虑的是,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 与存储桶一起放在负载均衡器的前面,这当然是完全可能的。我提到这一点是为了与上面的信息进行对比。
让我知道这是否有帮助:)