将 nginx 公开为负载均衡器与 Ingress 控制器有什么区别?
What's the difference between exposing nginx as load balancer vs Ingress controller?
我了解当我们想要使用单个负载均衡器/public IP 公开多个 service/routes 时可以使用 Ingress。
现在我想将我的 Nginx 服务器公开给 public。我有两个选择
- 设置
service type as LoadBalancer
瞧我得到public IP
- 使用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 是应用程序感知的,因此它可以根据应用程序状态确定将流量发送到哪里。
ingress 和 ingress controller 关系:
Ingress
或ingress rules
是ingress controller
遵循的分配负载的规则。入口控制器获取数据包,检查入口规则并确定将数据包传送到哪个服务。
Nginx 入口控制器
Nginx 入口控制器实际上使用 LoadBalancer 类型的服务作为集群的入口点。然后检查入口规则并分配负载。这可能非常令人困惑。您创建一个入口资源,它会创建 HTTP/S 负载均衡器。它还为您提供了一个外部 IP 地址(例如,在 GKE 上),但是当您尝试访问该 IP 地址时,连接被拒绝。
结论:
如果您只有一个应用程序,您将使用 Loadbalancer 类型的服务,例如 myapp.com
您想要映射到一个 IP 地址。
如果你有多个应用程序,你会使用入口资源,比如 myapp1.com
、myapp1.com/mypath
、myapp2.com
、..、myappn.com
映射到一个 IP地址。
由于入口是 L7,它能够区分 myapp1.com
和 myapp1.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
我了解当我们想要使用单个负载均衡器/public IP 公开多个 service/routes 时可以使用 Ingress。
现在我想将我的 Nginx 服务器公开给 public。我有两个选择
- 设置
service type as LoadBalancer
瞧我得到public IP - 使用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 是应用程序感知的,因此它可以根据应用程序状态确定将流量发送到哪里。
ingress 和 ingress controller 关系:
Ingress
或ingress rules
是ingress controller
遵循的分配负载的规则。入口控制器获取数据包,检查入口规则并确定将数据包传送到哪个服务。
Nginx 入口控制器
Nginx 入口控制器实际上使用 LoadBalancer 类型的服务作为集群的入口点。然后检查入口规则并分配负载。这可能非常令人困惑。您创建一个入口资源,它会创建 HTTP/S 负载均衡器。它还为您提供了一个外部 IP 地址(例如,在 GKE 上),但是当您尝试访问该 IP 地址时,连接被拒绝。
结论:
如果您只有一个应用程序,您将使用 Loadbalancer 类型的服务,例如 myapp.com
您想要映射到一个 IP 地址。
如果你有多个应用程序,你会使用入口资源,比如 myapp1.com
、myapp1.com/mypath
、myapp2.com
、..、myappn.com
映射到一个 IP地址。
由于入口是 L7,它能够区分 myapp1.com
和 myapp1.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