为什么 AKS 创建的 Azure 负载均衡器设置为将流量定向到节点上的端口 80 和 443,而不是服务打开的节点端口?
Why is Azure Load Balancer created by AKS set up to direct traffic to port 80 and 443 on nodes rather than nodeports opened by a service?
我有一个带有 nginx 入口控制器的 AKS 集群。 Controller 已创建类型为 LoadBalancer 的服务,Ports 部分如下所示(来自 kubectl get service
):
80:31141/TCP
如果我理解正确的话,端口 80 是一个从外部无法访问的 ClusterIp 端口,但端口 31141 是一个可以从外部访问的 NodePort 端口。所以我假设 Azure 负载均衡器正在向这个 31141 端口发送流量。
我惊讶地发现 Azure 负载均衡器设置了一条规则:
frontendPort: 80
backendPort: 80
probe (healthCheck): 31141
因此它实际上确实使用了节点端口,但仅用作健康检查,所有流量都发送到端口 80,其功能可能与 31141 相同。
奇怪的是,如果我尝试从 pod 访问端口 80 的节点 IP,我只会得到 "connection refused",但我想如果流量来自负载均衡器,它确实有效。
我无法在互联网上找到有关此的任何信息,所以问题是这到底是如何工作的,为什么 ALB 这样做?
P.S。我没有连接问题,它有效。我只是想了解它在幕后的运作方式和原因。
据我所知,您对入口端口有一些误解。让我向您展示一些有关 AKS 中的入口的详细信息。
入口信息:
从屏幕截图来看,端口80和443是Azure LB的端口,您可以使用与LB关联的public IP从Internet访问,这里的public IP是40.121.64.51。而端口31282和31869是AKS节点的端口,不能从Internet访问,只能通过节点私有IP从vnet访问。
Azure LB 信息:
健康探测:
磅规则:
从截图中可以看到健康探测和Azure LB的规则。它使用它们将流量从 Internet 重定向到 AKS 节点的端口,这些节点是 Azure LB 的后端。
希望对大家了解AKS中ingress的流量有所帮助
更新:
LB规则信息:
我想我已经弄清楚了它是如何工作的(免责声明:我的理解可能不正确,如果有误请指正)。
发生的情况是负载平衡流量既没有到达节点本身的端口 80,也没有到达打开的节点端口(在我的例子中为 31141)。相反,发送到节点的流量不是 "handled" 由节点本身发送,而是在 iptables 的帮助下进一步路由。因此,如果某些流量到达具有 LB frontendIP 和端口 80 的目标 IP 的节点,它将进入服务并进一步进入 pod。
至于健康检查,我想它不使用相同的端口 80,因为请求不会有等于外部 IP(LB 前端 IP)的目的地,而是直接节点本身,然后它使用服务 nodePort出于这个原因。
我有一个带有 nginx 入口控制器的 AKS 集群。 Controller 已创建类型为 LoadBalancer 的服务,Ports 部分如下所示(来自 kubectl get service
):
80:31141/TCP
如果我理解正确的话,端口 80 是一个从外部无法访问的 ClusterIp 端口,但端口 31141 是一个可以从外部访问的 NodePort 端口。所以我假设 Azure 负载均衡器正在向这个 31141 端口发送流量。
我惊讶地发现 Azure 负载均衡器设置了一条规则:
frontendPort: 80
backendPort: 80
probe (healthCheck): 31141
因此它实际上确实使用了节点端口,但仅用作健康检查,所有流量都发送到端口 80,其功能可能与 31141 相同。
奇怪的是,如果我尝试从 pod 访问端口 80 的节点 IP,我只会得到 "connection refused",但我想如果流量来自负载均衡器,它确实有效。
我无法在互联网上找到有关此的任何信息,所以问题是这到底是如何工作的,为什么 ALB 这样做?
P.S。我没有连接问题,它有效。我只是想了解它在幕后的运作方式和原因。
据我所知,您对入口端口有一些误解。让我向您展示一些有关 AKS 中的入口的详细信息。
入口信息:
从屏幕截图来看,端口80和443是Azure LB的端口,您可以使用与LB关联的public IP从Internet访问,这里的public IP是40.121.64.51。而端口31282和31869是AKS节点的端口,不能从Internet访问,只能通过节点私有IP从vnet访问。
Azure LB 信息:
健康探测:
磅规则:
从截图中可以看到健康探测和Azure LB的规则。它使用它们将流量从 Internet 重定向到 AKS 节点的端口,这些节点是 Azure LB 的后端。
希望对大家了解AKS中ingress的流量有所帮助
更新:
LB规则信息:
我想我已经弄清楚了它是如何工作的(免责声明:我的理解可能不正确,如果有误请指正)。
发生的情况是负载平衡流量既没有到达节点本身的端口 80,也没有到达打开的节点端口(在我的例子中为 31141)。相反,发送到节点的流量不是 "handled" 由节点本身发送,而是在 iptables 的帮助下进一步路由。因此,如果某些流量到达具有 LB frontendIP 和端口 80 的目标 IP 的节点,它将进入服务并进一步进入 pod。
至于健康检查,我想它不使用相同的端口 80,因为请求不会有等于外部 IP(LB 前端 IP)的目的地,而是直接节点本身,然后它使用服务 nodePort出于这个原因。