我们目前有一个谷歌云设置,它有一个后端服务(3 台虚拟机的托管实例组)位于 TCP 负载均衡器后面。在前端配置中,我们有一个静态外部 IP 地址,它将流量重定向到端口 6443,并且还在连接到负载均衡器的端口 6443 上进行了 tcp 健康检查。在后端服务中的 3 个 vm 实例中,最初只有一台机器在端口 6443 上运行服务。因此负载均衡器在负载均衡器详细信息页面中正确检测到一个健康实例和 2 个不健康实例。为了在端口 6443 上为不健康的 vm 实例提供服务,我们需要通过负载均衡器 ip 和同一端口连接到健康的 vm 实例。如果我们使用负载均衡器 ip 和端口 6443 从负载均衡器外部(而不是后端实例)连接到 vm 实例,我们可以看到连接成功通过后端服务中的健康 vm 实例。但是,当尝试从后端服务中的一个不健康的 vm 实例连接到负载均衡器时,我们可以看到连接被重定向回同一个实例,而不是健康的 vm 实例,从而导致连接被拒绝错误。谷歌云 tcp 负载均衡器中是否有设置允许负载均衡器 ip 和服务端口上的连接始终重定向到健康实例之一,即使请求源来自负载均衡器后面?但是,当尝试从后端服务中的一个不健康的 vm 实例连接到负载均衡器时,我们可以看到连接被重定向回同一个实例,而不是健康的 vm 实例,从而导致连接被拒绝错误。谷歌云 tcp 负载均衡器中是否有设置允许负载均衡器 ip 和服务端口上的连接始终重定向到健康实例之一,即使请求源来自负载均衡器后面?但是,当尝试从后端服务中的一个不健康的 vm 实例连接到负载均衡器时,我们可以看到连接被重定向回同一个实例,而不是健康的 vm 实例,从而导致连接被拒绝错误。谷歌云 tcp 负载均衡器中是否有设置允许负载均衡器 ip 和服务端口上的连接始终重定向到健康实例之一,即使请求源来自负载均衡器后面?
3 回答
来自后端的任何 LB 流量都将被来宾操作系统环回。外部路由机制看不到此流量,因此无法更改此行为。这是因为 LB IP 是本地路由表的一部分,操作系统将始终在此表中环回目的地。这与后端的健康状态无关。
就一般网络而言,这是不可能的。
作为一个基本示例,假设您有 3 个内部私有 IP 地址,让我们为您的每个 VM 分别称为 192.168.1.2、192.168.1.3 和 192.168.1.4。
假设所有负载均使用共享虚拟 IP 地址 192.168.1.5 进行负载平衡。
现在您的路由器位于 192.168.1.1,它的公共 IP 为 10.10.10.1,并且已配置为将传入外部流量定向到给定端口,例如用于 HTTP 流量的外部端口 80 到某个私有端口上的负载平衡 IP,为您的用例说 6443。
假设 192.168.1.2、192.168.1.3 不健康而 192.168.1.4 健康。
192.168.1.2 向 10.10.10.1:80 发送请求。
您的路由器现在将在 192.168.1.1 上接收该流量并将数据包发送到 10.10.10.1:80。
现在数据包在 10.10.10.1:80 的路由器接口上进入,然后路由器根据您的 NAT/端口转发规则将数据包路由到 192.168.1.5:6443。
数据包通过线路发送到 192.168.1.5:6443,由于唯一健康的主机是 192.168.1.4,数据包由该主机处理。
据我了解,您已经配置了一个以 MIG 作为后端的 TCP 负载均衡器。
在 TCP 负载均衡器中,它将原始连接直接从客户端路由到健康的后端,没有任何中断,后端虚拟机的响应直接到达客户端,而不是通过负载均衡器返回。
如果客户端 VM 是负载均衡器的后端 VM,并且发送到负载均衡器的 IP 地址转发规则的连接始终由后端 VM 本身回答,则无论后端 VM 是否健康,都会发生这种情况。发送到负载均衡器 IP 地址的所有流量都会发生这种情况,而不仅仅是负载均衡器转发规则中指定的协议和端口上的流量。
出于故障排除的目的,我建议您在项目的不同 VPC 网络中添加另一个测试 VM,并尝试从测试 VM 连接到负载均衡器外部 IP 地址。