Kubernetes:Ingress vs Load Balancer

时间:2017-07-13 11:59:30

标签: kubernetes load-balancing

我很担心Ingress和Load Balancer在Kubernetes中的角色。

据我所知,Ingress用于将来自互联网的传入流量映射到群集中运行的服务。

负载均衡器的作用是将流量转发到主机。在这方面,入口与负载平衡器有何不同?与Amazon ELB和ALB相比,kubernetes中的负载均衡器的概念是什么?

9 个答案:

答案 0 :(得分:130)

负载均衡器:kubernetes LoadBalancer服务是指向不在您的kubernetes集群中但在其他地方存在的外部负载均衡器的服务。假设您的pod可以从外部路由,它们可以与您的pod一起使用。 Google和AWS本身就提供此功能。就Amazon而言,在AWS中运行时直接映射到ELB和kubernetes可以为部署的每个LoadBalancer服务自动配置和配置ELB实例。

Ingress:入口实际上只是一组传递给正在侦听它们的控制器的规则。您可以部署一组入口规则,但除非您有可以处理它们的控制器,否则不会发生任何事情。如果配置为执行此操作,LoadBalancer服务可以侦听入口规则。

您还可以创建 NodePort 服务,该服务在群集外部具有可外部路由的IP,但指向群集中存在的窗格。这可能是一个Ingress控制器。

Ingress Controller只是一个配置为解释入口规则的pod。 nuberx是kubernetes支持的最受欢迎的入口控制器之一。就亚马逊而言,ALB can be used作为入口控制器。

例如,this nginx控制器能够摄取您已定义的入口规则,并将它们转换为nginx.conf文件,并在其pod中加载和启动。

例如,让我们说你按如下方式定义了一个入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
   ingress.kubernetes.io/rewrite-target: /
 name: web-ingress
spec:
  rules:
  - host: kubernetes.foo.bar
    http:
      paths:
      - backend:
          serviceName: appsvc
          servicePort: 80
        path: /app

如果您再检查nginx控制器窗格,则会在/etc/nginx.conf中看到以下规则:

server {
    server_name kubernetes.foo.bar;
    listen 80;
    listen [::]:80;
    set $proxy_upstream_name "-";
    location ~* ^/web2\/?(?<baseuri>.*) {
        set $proxy_upstream_name "apps-web2svc-8080";
        port_in_redirect off;

        client_max_body_size                    "1m";

        proxy_set_header Host                   $best_http_host;

        # Pass the extracted client certificate to the backend

        # Allow websocket connections
        proxy_set_header                        Upgrade           $http_upgrade;
        proxy_set_header                        Connection        $connection_upgrade;

        proxy_set_header X-Real-IP              $the_real_ip;
        proxy_set_header X-Forwarded-For        $the_x_forwarded_for;
        proxy_set_header X-Forwarded-Host       $best_http_host;
        proxy_set_header X-Forwarded-Port       $pass_port;
        proxy_set_header X-Forwarded-Proto      $pass_access_scheme;
        proxy_set_header X-Original-URI         $request_uri;
        proxy_set_header X-Scheme               $pass_access_scheme;

        # mitigate HTTPoxy Vulnerability
        # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
        proxy_set_header Proxy                  "";

        # Custom headers

        proxy_connect_timeout                   5s;
        proxy_send_timeout                      60s;
        proxy_read_timeout                      60s;

        proxy_redirect                          off;
        proxy_buffering                         off;
        proxy_buffer_size                       "4k";
        proxy_buffers                           4 "4k";

        proxy_http_version                      1.1;

        proxy_cookie_domain                     off;
        proxy_cookie_path                       off;

    rewrite /app/(.*) /$1 break;
    rewrite /app / break;
    proxy_pass http://apps-appsvc-8080;

    }

Nginx刚刚创建了一条规则,可以将http://kubernetes.foo.bar/app路由到指向群集中的服务appsvc

以下是an example如何使用nginx入口控制器实现kubernetes集群。希望这有帮助!

答案 1 :(得分:30)

我发现this very interesting article解释了NodePort,LoadBalancer和Ingress之间的区别。

从文章中的内容:

<强>负载平衡器:

  

LoadBalancer服务是向服务器公开服务的标准方法   互联网。在GKE上,这将启动一个网络负载均衡器   给你一个IP地址,将所有流量转发给你   服务。

     

如果要直接公开服务,这是默认方法。   您指定的端口上的所有流量都将转发到该服务。   没有过滤,没有路由等。这意味着你几乎可以发送   任何类型的流量,如HTTP,TCP,UDP,Websockets,gRPC或   不管。

     

最大的缺点是您使用LoadBalancer公开的每个服务   将获得自己的IP地址,您必须支付LoadBalancer   每次暴露的服务,这可能会变得昂贵!

<强>入口:

  

Ingress实际上不是一种服务。相反,它坐在前面   多个服务并充当“智能路由器”或入口点   你的集群。

     

你可以用Ingress做很多不同的事情   许多类型的Ingress控制器具有不同的功能。

     

默认的GKE入口控制器将启动HTTP(S)加载   适合你的平衡器。这将允许您同时执行基于路径和子域   基于路由到后端服务。例如,您可以发送   foo.yourdomain.com上foo服务的一切,以及一切   在yourdomain.com/bar/栏目服务的路径下。

     

Ingress可能是最有效的公开服务的方式,但是   也可能是最复杂的。 Ingress有很多种类型   控制器,来自Google Cloud Load Balancer,Nginx,Contour,   Istio等等。还有Ingress控制器的插件,比如   证书管理员,可以自动配置SSL证书   为您的服务。

     

如果要公开多个服务,Ingress是最有用的   在相同的IP地址下,这些服务都使用相同的L7   协议(通常是HTTP)。如果您,您只需支付一个负载均衡器   正在使用本机GCP集成,因为Ingress是“聪明的”   你可以获得很多开箱即用的功能(如SSL,Auth,Routing,   等)

答案 2 :(得分:8)

TL:DR

  1. Ingress位于公共网络(Internet)和公开展示我们Api实施的Kubernetes服务之间。
  2. Ingress能够提供负载平衡,SSL终止和基于名称的虚拟主机。
  3. Ingress功能允许从单个域名安全地公开多个API或应用程序。
  4. 让我们从实际用例开始:您有多个Apis支持服务实现包(ASIP用于保密和简洁),以便在一个域名下部署。由于您是一名前沿开发人员,因此您实施了一种微服务架构,该架构需要为每个ASIP单独部署,以便可以单独升级或扩展。当然,这些ASIP封装在单独的docker容器中,并可从容器存储库提供给Kubernetes(K8s)。

    现在让我们说你想在Google的GKE K8上部署它。为了实现持续可用性,每个ASIP实例(副本)部署在不同节点(VM)上,其中每个VM具有其自己的云内部IP地址。每个ASIP部署都配置为恰当的名称&#34; deployment.yaml&#34;您声明性地指定的文件,其中包括应部署的给定ASIP K8的副本数。

    下一步是将API暴露给外部世界,并将请求汇集到部署的ASIP实例之一。由于我们在不同节点上运行了相同ASIP的许多副本,因此我们需要一些能够在这些副本之间分发请求的东西。要解决此问题,我们可以创建并应用&#34; service.yaml&#34;将配置K8s服务(KServ)的文件,该服务将通过IP地址向外公开并可访问。该KServ将负责在其配置的ASIP之间分配API的请求。请注意,当ASIP的节点发生故障并重新启动时,K8主机将自动重新配置KServ。在这种情况下,内部IP地址永远不会被重用,并且必须告知KServ新的ASIP部署位置。

    但是我们还有其他Api服务包,它们将在同一域名上公开。旋转新的KServ将创建新的外部IP地址,但我们无法在同一域名上公开它。嗯,这就是Ingress进来的地方。

    Ingress坐在互联网和我们向外界展示的所有KServices之间。 Ingress能够提供负载平衡,SSL终止和基于名称的虚拟主机。后一种容量能够通过分析它的URL将传入的请求路由到正确的服务。当然,必须配置Ingress并使用...&#34; ingress.yaml&#34;文件,用于指定将请求发送到正确的KServ所需的重写和路由。

    互联网 - &gt; Ingress - &gt; K8s服务 - &gt;副本

    因此,通过正确的入口,KServices和ASIP配置,我们可以使用相同的域名安全地公开许多API。

答案 3 :(得分:1)

入口:入口对象+入口控制器

入口对象:

就像服务对象一样,只是它不单独执行任何操作。入口对象只是通过指定诸如请求路径,请求域和目标kubernetes服务之类的东西描述了一种将第7层流量路由到您的集群中的方法,而服务对象实际上是在创建服务

入口控制器:

一项服务,其中:

  1. listens on specific ports (usually 80 and 443) for web traffic
  2. Listens for the creation, modification, or deletion of Ingress Objects
  3. Creates internal L7 routing rules based on these Ingress Objects

例如,Nginx Ingress控制器可以使用服务侦听端口80和443,然后读取新的Ingress对象并将其解析为新的server {}部分,然后将其动态放置到nginx.conf中。

LoadBalancer:外部负载均衡器提供程序+服务类型

外部负载均衡器提供商:

外部负载平衡器提供程序通常在AWS和GKE等云中进行配置,并提供了一种通过创建外部负载平衡器来分配外部IP的方法。可以通过将服务指定为“ LoadBalancer”类型来使用此功能。

服务类型:

当服务类型设置为LoadBalancer时,Kubernetes尝试创建一个外部负载均衡器,然后使用Kubernetes Pod的条目对其进行编程,从而为它们分配外部IP。

Kubernetes服务控制器可自动创建外部负载均衡器,运行状况检查(如果需要),防火墙规则(如果需要),并检索由云提供商分配并填充的新创建或配置的LoadBalancer的外部IP。它放在服务对象中。

关系:

入口控制器服务通常以LoadBalancer类型提供,因此可以通过外部ip将http和https请求代理/路由到特定的内部服务。

但是,为此并不一定需要LoadBalancer。由于通过使用hostNetwork或hostPort,您可以从技术上将主机上的端口绑定到服务(允许您通过主机外部ip:port来访问它)。尽管官方不建议这样做,因为它会占用实际节点上的端口。

参考:

https://kubernetes.io/docs/concepts/configuration/overview/#services

https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/

https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#external-load-balancer-providers

https://kubernetes.io/docs/concepts/services-networking/ingress/

答案 4 :(得分:0)

简单来说,负载均衡器将请求分配到多个(相同类型的)后端服务中,而入口更像是一个API网关(反向代理),它将基于URL将请求路由到特定的后端服务

答案 5 :(得分:0)

有3种方法允许群集中的Pod接收外部流量:
1.)NodePort服务
2.)LoadBalancer服务(基于NodePort服务构建)
3.)入口控制器+入口对象(基于LoadBalancer服务构建)

假设您的群集中托管了10个网站,并且您希望将它们全部暴露给外部流量。
**如果使用LoadBalancer Service类型,将产生10个HA Cloud负载均衡器(每个都需要花钱)
*如果您使用Ingress Controller类型,则会生成1个HA Cloud负载均衡器(节省资金),并且它将指向集群中运行的Ingress Controller。

入口控制器为:

  • 由群集中运行的Pod部署支持的负载均衡器类型的服务。
  • 每个吊舱都有2件事:
    1. 充当群集中运行的第7层负载均衡器。 (Nginx有多种口味很受欢迎)
    2. 根据集群中的入口对象动态配置自身
      (入口对象可以看作是第7层负载均衡器的声明性配置片段。)

集群中的L7 LB / Ingress控制器负载均衡/向集群中的集群IP服务的反向代理流量,如果您具有TLS cert类型的Kubernetes Secret和引用它的Ingress对象,它也可以终止HTTPS。)

enter image description here

答案 6 :(得分:0)

豆荚有自己的IP:PORT,但实际上是动态的,如果删除或重新部署,它们会发生变化。

为服务分配了ClusterIPNodePort(在VM中创建服务资源的端口),可以将其映射到Pod集合或其他后端[请参阅:headless services]

  • 要访问正确的Pod,请使用ClusterIP(在clutser中)

  • NodePort可用于从集群外部访问吊舱

LoadBalancer [外部/内部]:由云提供商提供,指向ClusterIPNodePort。您可以使用LB的IP访问该服务

LB〜>服务(ClusterIPNodePort)〜> POD

入口资源是群集的入口点。LB可以侦听入口规则并可以路由到特定服务。[请参阅此example]

LB(入口管理)〜>服务(ClusterIPNodePort)〜> POD

答案 7 :(得分:0)

<头>
Feature Ingress Load Balancer
协议 HTTP 级别(网络层 7) 网络层4
附加功能 基于cookie的会话亲和性,Ingress rulesResource backendsPath types 只平衡负载
依赖 Ingress controller 需要运行。不同的 Kubernetes 环境使用不同的控制器实现,但有一些根本不提供默认控制器。 无依赖,K8内置支持
YAML manifest 有单独的API。 apiVersion: networking.k8s.io/v1 type: LoadBalancer
工作原理 客户端通过 Ingress 控制器连接到其中一个 Pod。客户端首先对example.com进行DNS查找,DNS服务器(或本地操作系统)返回Ingress控制器的IP。然后,客户端向 Ingress 控制器发送 HTTP 请求,并在 Host 标头中指定 example.com。根据该标头,控制器确定客户端尝试访问的服务,通过与服务关联的 Endpoints object 查找 pod IP,并将客户端的请求转发到其中一个 pod。 负载均衡器将流量重定向到所有节点的节点端口。客户端通过负载均衡器的 IP 连接到服务。

答案 8 :(得分:-1)

负载均衡器服务:是第 4 层代理(TCP、UDP 等)。它运行在 Kubernetes 集群网络之外。它没有第 7 层的功能:断路器、测量请求数量、请求延迟、失败、路由……

入口: 是第 7 层代理(http、https、gRPC 等)。它是 Kubernetes 集群网络内 pod 中的一个应用程序。如果入口 Pod 挂了,Kubernetes 将重新启动它或将其移动到集群中的其他节点。