将 nginx 公开为负载均衡器与 Ingress 控制器有什么区别?

What's the difference between exposing nginx as load balancer vs Ingress controller?

我了解当我们想要使用单个负载均衡器/public IP 公开多个 service/routes 时可以使用 Ingress。

现在我想将我的 Nginx 服务器公开给 public。我有两个选择

  1. 设置service type as LoadBalancer瞧我得到public IP
  2. 使用Nginx Ingress Controller

现在我可以使用选项 1 完成我的工作,什么时候或为什么我会选择选项 2 使用 nginx 和 Ingress 而没有 Ingress 的优势是什么?

ingress 规则 (ingress)ingress controller 有区别。因此,从技术上讲,nginx ingress controller 和 LoadBalancer 类型的服务没有可比性。您可以比较入口资源和 LoadBalancer 类型的服务,如下所示。

一般来说:

LoadBalancer 类型的服务是 L4(TCP) 负载平衡器。您将使用它向外界公开单个应用程序或服务。它会根据目标 IP 地址和端口来平衡负载。

Ingress 类型的资源将创建一个 L7(HTTP/S) 负载均衡器。您可以使用它同时公开多个服务,因为 L7 LB 是应用程序感知的,因此它可以根据应用程序状态确定将流量发送到哪里。

ingressingress controller 关系:

Ingressingress rulesingress controller 遵循的分配负载的规则。入口控制器获取数据包,检查入口规则并确定将数据包传送到哪个服务。

Nginx 入口控制器

Nginx 入口控制器实际上使用 LoadBalancer 类型的服务作为集群的入口点。然后检查入口规则并分配负载。这可能非常令人困惑。您创建一个入口资源,它会创建 HTTP/S 负载均衡器。它还为您提供了一个外部 IP 地址(例如,在 GKE 上),但是当您尝试访问该 IP 地址时,连接被拒绝。

结论:

如果您只有一个应用程序,您将使用 Loadbalancer 类型的服务,例如 myapp.com 您想要映射到一个 IP 地址。

如果你有多个应用程序,你会使用入口资源,比如 myapp1.commyapp1.com/mypathmyapp2.com、..、myappn.com 映射到一个 IP地址。

由于入口是 L7,它能够区分 myapp1.commyapp1.com/mypath,它能够将流量路由到正确的服务。

接受的答案已经涵盖了很多内容。所有原因都是有效的,除了我在 aws 中使用入口控制器的原因是为了最大限度地降低成本。我在 kubernetes 集群 aws 中有多个 Web 应用程序 运行。为了访问这些应用程序而不是将单个应用程序公开为 LoadBalancer 并创建单独的 ELB(每个 ELB 都需要花钱),我将入口控制器服务公开为 LoadBalancer 并为每个应用程序创建入口规则。

步骤涉及:

  • 入口服务,公开为在 aws 中创建 ELB 的负载均衡器 elb1.aws.com
  • 每个 Web 应用程序的入口规则,例如 example.com、awesome.com、helloworld.com
  • Route53映射都映射到同一个ELB,例如: example.com -> elb1.aws.com awesome.com -> elb1.aws.com helloworld.com -> elb1.aws.com