我们为什么需要使用负载均衡器通过Ingress暴露Kubernetes服务?

7
针对部署在Google Kubernetes Engine上的样例微服务架构,我需要帮助验证我的理解:
  1. 我们知道服务应该为Pod副本集负载均衡。
  2. 当我们创建一个nginx ingress控制器和ingress定义来路由到每个服务时,负载均衡器也会自动设置。
  3. 我曾经在某处阅读到创建nginx ingress控制器意味着在幕后创建了一个nginx控制器(deployment)和一个负载均衡器类型的服务。不确定这是否正确。

看起来负载均衡是通过服务进行的,基于URL的路由是由ingress控制器进行的。

我们为什么需要一个负载均衡器?它并不是用于跨多个实例的负载均衡。它只会将所有流量转发到创建的nginx反向代理,并根据URL路由请求。

如果我的理解有误,请纠正。


这个网址相当详细地解释了负载均衡器的必要性。 https://aws.amazon.com/blogs/opensource/network-load-balancer-nginx-ingress-controller-eks/ - inaitgaJ
3个回答

9

一个 Service 类型 LoadBalancerIngress 是访问您的应用程序的外部方式,尽管它们的工作方式不同。

Service:

在 Kubernetes 中,Service 是一种抽象,它定义了一组逻辑 Pod 以及访问它们的策略(有时将此模式称为微服务)。由 Service 目标的一组 Pod 通常由 选择器 确定(请参阅下面的 原因,了解为什么您可能希望没有选择器的 Service)。

有一些类型的服务,其中之一是 LoadBalancer 类型,允许您分配外部 IP 来公开您的应用程序。对于每个 LoadBalancer 服务,都会为其分配一个新的外部 IP。 负载均衡将由 kube-proxy 处理。

Ingress:

一个API对象,用于管理集群中服务的外部访问,通常是HTTP。Ingress可以提供负载均衡、SSL终止和基于名称的虚拟主机。

当您设置Ingress(例如:nginx-ingress)时,将为Ingress控制器pod创建一个LoadBalancer类型的Service,并自动在云提供商中创建负载均衡器,并分配公共IP地址给nginx-ingress服务。

这个负载均衡器/公共IP将用于所有服务的传入连接,而nginx-ingress将负责处理传入连接。

例如:

假设您有10个LoadBalancer类型的服务:这将导致创建10个新的公共IP,并且您需要使用相应的IP地址才能访问所需的服务。

但是,如果使用Ingress,则只会创建1个IP,并且Ingress将负责根据您在Ingress配置中定义的PATH/URL来处理正确服务的传入连接。使用Ingress,您可以:

  • 使用正则表达式在path中定义要重定向的服务;
  • 使用SSL / TLS
  • 注入自定义标头;
  • 如果一个服务失败,则重定向请求到默认服务(默认后端);
  • 基于IP创建白名单
  • 等等...

关于Ingress负载平衡的一个重要注意事项

GCE / AWS负载均衡器不为其目标池提供权重。这对于旧的LB kube-proxy规则来说不是问题,它会正确地平衡所有端点。

使用新功能时,外部流量不会在所有Pod之间平均负载平衡,而是在节点级别平均负载平衡(因为GCE / AWS和其他外部LB实现没有指定每个节点权重的能力,他们在所有目标节点上平衡,而不考虑每个节点上的Pod数量)。


2
一个入口控制器(例如nginx)Pod需要作为所有南北流量进入kubernetes集群的入口点而在kubernetes集群外部暴露。一种方法是通过LoadBalancer实现。您也可以使用NodePort,但不建议在生产环境中使用,或者您可以直接在具有公共IP的主机网络上部署入口控制器。拥有负载均衡器还可以实现对入口控制器Pod的多个副本的流量负载均衡。
当使用入口控制器时,流量从负载均衡器传递到入口控制器,然后根据入口资源中定义的规则到达后端POD IP。这绕过了Kubernetes服务和Kubernetes服务提供的层4 kube-proxy负载平衡。在内部,入口控制器从Kubernetes服务的端点中发现所有POD IP,并直接将流量路由到POD。

1
似乎负载均衡是由服务执行的。基于URL的路由是由Ingress控制器执行的。
服务确实可以在Pod之间平衡流量。但默认情况下(ClusterIP类型),它们无法在Google Kubernetes Engine之外访问。您可以创建LoadBalancer类型的服务,但每个服务将获得自己的IP地址(网络负载均衡器),因此可能会变得昂贵。而且,如果您有一个具有不同服务的应用程序,最好使用提供单个入口点的Ingress对象。当您创建Ingress对象时,Ingress控制器(例如nginx)将创建一个Google Cloud HTTP(S)负载均衡器。反过来,Ingress对象可以与一个或多个Service对象关联。
然后,您可以从Ingress对象获取分配的负载均衡器IP:
kubectl get ingress ingress-name --output yaml
结果是,您的Pod中的应用程序可以在Kubernetes集群之外访问:
LoadBalancerIP/url1 -> service1 -> pods
LoadBalancerIP/url2 -> service2 -> pods

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接