如何在 GKE 中的负载均衡器后面使用入口?

How do I use an ingress behind a load balancer in GKE?

我正在使用 k8s 部署我的应用程序,它包含 3 个部分。主网站(登录页面)、应用程序组件 1(仅限管理员)和应用程序组件 2(付费用户)。我最近遇到了一种模式,其中有一个主要的外部负载均衡器,以及应用程序每个部分的入口。例如:

LB 
  -> Ingress1 -> Main App
  -> Ingress2 -> App Component 1 (only accessible by admins)
  -> Ingress3 -> App Component 2 (only accessible by paid users)

这样的架构很常见吗? 有人能给我指出一些很好的例子(使用 k8s),它们正在部署这样的应用程序。提前致谢!

GKE 不支持使用 Ingress 或负载均衡器作为其他负载均衡器的后端。相反,您可以执行以下操作之一:

  1. 为每个入口点创建一个入口(这更昂贵)

  2. 使用多个路径创建单个 Ingress(每个后端一个)。这将根据输入的 URL 路由流量。这可能是您最好且最具成本效益的解决方案。为了安全起见,您可以合并 Cloud Armor 以确保用户只访问他们应该访问的路径。

  3. 创建一个 Ingress 来公开您的主应用程序,然后使用服务类型 LoadBalancers 来公开付费门户和管理门户。这些将作为第 4 层工作(因此您需要有一个 DNS 记录来将管理员和付费 URL 指向适当的 IP)。您可以将负载均衡器 spec.loadBalancerSourceRanges 字段配置为仅允许特定 IP 范围以限制对管理门户的访问

另一方面,在入口前放置负载均衡器对您的布局没有什么好处,因为您不希望平衡 3 个入口之间的流量。您希望所有流量都进入入口,然后被定向到正确的后端并在服务 pods.

之间保持平衡

我们可以遵循的最常见的方法是创建一个入口,它将根据路径转发流量。 例如,

paths:
          - path: /app1/
            backend:
              serviceName: app_1
              servicePort: 80
          - path: /app2/
            backend:
              serviceName: app_2
              servicePort: 80

所以"serviceName"是k8s(LB/NodePort/ClusterIP)中创建的任意服务名。 最后使用这个在外部 LB/App GW 中创建的入口将您的外部流量转发到您的应用程序。