入口vs负载均衡器

我对入口和负载均衡器在Kubernetes中的角色感到非常困惑。

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

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

138490 次浏览

kubernetes LoadBalancer服务是一个指向外部负载均衡器的服务,这些负载均衡器不在你的kubernetes集群中,但存在于其他地方。它们可以与您的舱一起工作,假设您的舱是外部可路由的。谷歌和AWS在本地提供此功能。就Amazon而言,当在AWS中运行时,它直接与ELB和kubernetes映射,可以为部署的每个LoadBalancer服务自动提供和配置ELB实例。

一个入口实际上只是一组要传递给正在监听它们的控制器的规则。你可以部署一堆入口规则,但是除非你有一个可以处理它们的控制器,否则什么都不会发生。LoadBalancer服务可以监听入口规则,如果它被配置为这样做的话。

你也可以创建一个NodePort服务,它在集群外有一个外部可路由的IP,但指向一个存在于集群内的pod。这可能是一个入口控制器。

入口控制器是一个简单的pod,它被配置为解释入口规则。kubernetes支持的最流行的入口控制器之一是nginx。对于Amazon, ALB 可以使用作为一个入口控制器。

例如, 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

下面是一个例子关于如何使用nginx入口控制器实现kubernetes集群。希望这能有所帮助!

我找到了这篇很有趣的文章,它解释了NodePort, LoadBalancer和Ingress之间的差异。

从文章的内容来看:

loadbalance:

LoadBalancer服务是将服务公开给 互联网。在GKE上,这将启动一个网络负载均衡器 给你一个单一的IP地址,将所有流量转发到你的 服务。< / p >

如果你想直接公开一个服务,这是默认方法。 您指定的端口上的所有流量都将被转发到该服务。 没有过滤,没有路由等等。这意味着你几乎可以发送 任何类型的流量到它,如HTTP, TCP, UDP, Websockets, gRPC,或 无论什么。< / p > 最大的缺点是你使用LoadBalancer公开的每个服务 将获得自己的IP地址,你必须支付一个LoadBalancer 每个公开的服务,这可能会很昂贵!< / p >

入口:

Ingress实际上不是一种服务类型。相反,它位于前面 用于多种服务,并充当“智能路由器”或入口点 集群。< / p > 你可以用Ingress做很多不同的事情,确实有 许多类型的入口控制器具有不同的功能 默认的GKE入口控制器将启动HTTP(S) Load 你的平衡器。这将允许您同时进行基于路径和子域的操作 基于到后端服务的路由。例如,您可以发送 foo.yourdomain.example上的所有内容到foo服务,以及所有内容 在yourdomain.example/bar/路径下的bar服务 Ingress可能是公开服务的最强大的方式,但是 也可能是最复杂的。Ingress有多种类型 控制器,从谷歌云负载均衡器,Nginx,轮廓, Istio等等。也有用于入口控制器的插件,比如 证书管理器,可以自动发放SSL证书

如果您想公开多个服务,Ingress是最有用的 在同一个IP地址下,这些服务都使用相同的L7 协议(通常是HTTP)。你只需支付一个负载均衡器,如果你 正在使用原生GCP集成,并且由于Ingress是“智能的” 你可以获得很多开箱即用的功能(如SSL,认证,路由, 等)< / p >

TL:博士

  1. Ingress位于公共网络(Internet)和公开Api实现的Kubernetes服务之间。
  2. Ingress能够提供负载平衡、SSL终止和基于名称的虚拟主机。
  3. 入口功能允许从一个域名安全地公开多个API或应用程序。

让我们从实际用例开始:您有多个由服务实现包(ASIP)支持的api,可以在一个域名下部署。作为一名前沿开发人员,您实现了一种微服务架构,需要为每个ASIP单独部署,以便它们可以单独升级或扩展。当然,这些asip被封装在单独的docker容器中,并从容器存储库中提供给Kubernetes。

让我们假设现在你想在谷歌的GKE k8上部署这个。为了实现持续可用性,每个ASIP实例(副本)部署在不同的节点(VM)上,其中每个VM都有自己的云内部IP地址。每个ASIP部署都配置在一个合适的名称“deployment”中。您可以在其中声明性地指定给定ASIP k8应该部署的副本的数量。

下一步是向外界公开API,并将请求输送到已部署的ASIP实例之一。由于相同ASIP的多个副本运行在不同的节点上,因此需要在这些副本之间分发请求。为了解决这个问题,我们可以创建并应用一个“服务”。该文件将配置一个K8s服务(KServ),该服务将对外公开,并可通过IP地址访问。这个KServ将负责API在其配置的asip之间的请求分发。注意,当ASIP节点故障并重新启动时,KServ将由K8s主服务器自动重新配置。在这种情况下,内部IP地址永远不会被重用,必须将新的ASIP的部署位置通知KServ。

但是我们有其他Api服务包,应该在相同的域名上公开。旋转一个新的KServ将创建一个新的外部IP地址,我们将无法在相同的域名上公开它。这就是Ingress的用武之地。

Ingress位于Internet和我们向外部世界公开的所有KServices之间。Ingress能够提供负载平衡、SSL终止和基于名称的虚拟主机。后一种功能能够通过分析传入请求的URL将其路由到正确的服务。当然,Ingress必须配置和应用一个…”入口。该文件将指定重写以及向正确的KServ发送请求所需的路由。

Internet ->入口-> K8s服务->副本

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

短版:

在Kubernetes中,对象定义定义所需的状态,而控制器则监视对象定义以实现该状态。

入口:

  • “Ingress"对象,该对象本身不做什么,但定义了L7负载均衡规则
  • “进入Controller"根据Ingress object中定义的规则创建L7 LB配置

loadbalance:

  • “Service"类型为“loadbalancer”的对象。允许服务附加到LoadBalancer
  • “负载均衡器控制器”;它根据服务对象中定义的规则创建负载均衡器

入口

进入对象:

一个kubernetes对象,它自己不做任何事情,因为默认情况下不包括入口控制器。Ingress对象只是通过指定请求路径、请求域和目标kubernetes服务来描述将第7层流量路由到集群的方法,而添加服务对象实际上可能会创建服务,因为默认情况下kubernetes中包含了服务控制器。

入口控制器:

Kubernetes部署/DaemonSet +服务:

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

例如,Nginx入口控制器可以:

  1. 使用服务在端口80和443监听传入的流量
  2. 注意Ingress对象的创建,并将所需的状态转换为新的服务器{}部分,这些部分将动态地放入nginx.conf中

loadbalance

负载均衡器控制器:

负载均衡器控制器可以在AWS和GKE等平台上配置,并提供一种通过创建外部负载均衡器分配外部ip的方法。此功能可用于:

  1. 部署负载均衡器控制器(如果尚未部署)
  2. 设置一个服务类型为“loadbalancer”;
  3. 在服务中设置适当的注释以配置负载均衡器

服务类型:

当服务类型设置为LoadBalancer并且存在云提供的负载均衡器控制器时,该服务将使用云提供商的负载均衡器对外公开。NodePort和ClusterIP服务(外部负载均衡器路由到的服务)自动创建,从而分配服务外部ip和或DNS。

的关系

入口控制器服务通常配置为LoadBalancer类型,以便http和https请求可以通过外部ip代理/路由到特定的内部服务。

然而,这并不严格需要LoadBalancer。因为,通过使用hostNetwork或hostPort,您可以在技术上将主机上的端口绑定到服务(允许您通过主机的外部ip:port访问它)。虽然官方不建议这样做,因为它会占用实际节点上的端口。

参考文献

< a href = " https://kubernetes。io / docs /概念/配置/ / #服务概述noreferrer“rel = > https://kubernetes.io/docs/concepts/configuration/overview/服务< / >

< a href = " https://kubernetes。io / docs /任务/ access-application-cluster / create-external-load-balancer noreferrer“rel = > https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/ < / >

< a href = " https://kubernetes。io / docs /任务/ access-application-cluster create-external-load-balancer / # external-load-balancer-providers noreferrer“rel = > https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/ external-load-balancer-providers < / >

< a href = " https://kubernetes。io / docs /概念/ services-networking /进入/ noreferrer“rel = > https://kubernetes.io/docs/concepts/services-networking/ingress/ < a href = " https://kubernetes。io / docs /概念/建筑/云控制器/ noreferrer“rel = > https://kubernetes.io/docs/concepts/architecture/cloud-controller/ < / > https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.3/ < / p >

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

有4种方法允许集群中的pod接收外部流量: < br > 1)。Pod using HostNetworking: true和(允许每个节点有1个Pod直接监听主机节点上的端口。Minikube、bare metal和rasberry pi有时会走这条路,这可以允许主机节点在端口80/443上监听,不允许使用负载均衡器或高级云负载均衡器配置,它还绕过了Kubernetes Services,这可以用于避免SNAT/实现类似externalTrafficPolicy: Local的效果,在不支持的场景下,如AWS。) < br > 2)。NodePort服务 < br > 3)。LoadBalancer服务(基于NodePort服务)
4)。入口控制器+入口对象(基于上述)

假设你的集群中有10个网站,你想把它们全部暴露给外部流量。
*如果你使用类型LoadBalancer服务,你将生成10个HA云负载均衡器(每个都需要花钱) 如果你使用类型Ingress Controller,你将生成1个HA云负载均衡器(节省资金),它将指向一个在你的集群中运行的Ingress Controller。
一个入口控制器是:

  • 由集群中运行的pod部署支持的负载均衡器类型的服务。
  • 每个豆荚做两件事:
    1. 充当在集群内运行的第7层负载均衡器。(Nginx很受欢迎)
    2. 根据集群中的入节点对象动态配置自身
      (入口对象可以被认为是第7层负载均衡器的声明性配置片段。)
    3. 李< / ol > < / >

集群内的L7 LB/Ingress Controller负载均衡/反向代理流量到集群内的集群IP服务,如果你有一个TLS证书类型的Kubernetes Secret,它也可以终止HTTPS,并引用它的Ingress对象。)

enter image description here

Pods有自己的IP:PORT,但它本质上是动态的,如果删除或重新部署会发生变化。

服务被分配为__abc0或NodePort(创建服务资源的虚拟机中的端口),可以映射到一组pod或其他后端[参见:无头服务)

  • 要访问正确的Pod,请使用ClusterIP(从集群中)

  • NodePort可以用于从集群外部访问pods

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

磅~比;SERVICE(ClusterIPNodePort) ~>圆荚体

入口资源是集群的入口点。负载均衡可以侦听入路规则,并路由到特定的服务。[参见此例子)

磅(Ingress-managed) ~比;SERVICE(ClusterIPNodePort) ~>圆荚体

loadbalance服务:是一个第4层代理(TCP, UDP,..)。它运行在Kubernetes集群网络之外。它没有第七层的功能:断路器,测量请求的数量,请求的延迟,失败,路由,…

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

< span style=" font - family:宋体;"> Feature < / th > < span style=" font - family:宋体;"> Ingress < / th > < span style=" font - family:宋体;"> Load Balancer < / th > < span style=" font - family:宋体;"< / > < >强协议强> < / td > < span style=" font - family:宋体;">HTTP级别(网络7层) . >HTTP级别(网络7层 < span style=" font - family:宋体;">网络四层 . >网络四层 . > < span style=" font - family:宋体;"< / > < >强附加功能强大的> < / td > < span style=" font - family:宋体;">基于cookie的会话关联,输入规则资源后端路径类型 . io/docs/concepts/services-networking/ingress < span style=" font - family:宋体;">只平衡负载 < span style=" font - family:宋体;"< / > < >强依赖性强> < / td > < span style=" font - family:宋体;"> < a href = " https://kubernetes。io/docs/concepts/services-networking/ Ingress -controllers/" rel="noreferrer">Ingress controller need to be running. io/docs/concepts/services-networking/ Ingress -controllers/" rel="noreferrer">不同的Kubernetes环境使用不同的控制器实现,但有些环境根本不提供默认控制器 < span style=" font - family:宋体;">无依赖,内置支持K8 < span style=" font - family:宋体;"< / > < >强YAML清单强> < / td > < span style=" font - family:宋体;"它有单独的API。apiVersion: networking.k8s.io/v1 td > < / < span style=" font - family:宋体;"> type: LoadBalancer td > < / < span style=" font - family:宋体;">如何工作 . < span style=" font - family:宋体;">客户端通过Ingress控制器连接到一个pod。客户端首先对example.com执行DNS查找,然后DNS服务器(或本地操作系统)返回Ingress控制器的IP。然后客户端向Ingress控制器发送一个HTTP请求,并在Host报头中指定example.com。从这个报头,控制器确定客户端试图访问哪个服务,通过端点对象查找pod的ip,并将客户端请求转发到其中一个pod . < span style=" font - family:宋体;">负载均衡器将所有节点上的流量重定向到该节点端口。客户端通过负载均衡器的IP连接到服务
人力资源/ > < / div > <

我强烈推荐阅读 NodePort vs LoadBalancer vs Ingress? for Knowledge ++

为了理解这一点,我认为最好问为什么我们需要入口为什么负载均衡器是不够的;

我在这本书中找到了最好的答案。

理解为什么需要ingress

一个重要的原因是每个LoadBalancer服务都需要它的 有自己的公网IP地址的负载均衡器,而Ingress 只需要一个,即使在提供对数十个服务的访问时也是如此。 当客户端向Ingress发送HTTP请求时,主机和路径 在请求中确定请求被转发到哪个服务