为什么 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出于这个原因。