![来自区域内的 GCE TCP 负载均衡器访问始终路由到同一区域](https://linux22.com/image/735110/%E6%9D%A5%E8%87%AA%E5%8C%BA%E5%9F%9F%E5%86%85%E7%9A%84%20GCE%20TCP%20%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E8%AE%BF%E9%97%AE%E5%A7%8B%E7%BB%88%E8%B7%AF%E7%94%B1%E5%88%B0%E5%90%8C%E4%B8%80%E5%8C%BA%E5%9F%9F.png)
我们在 GCE 的三个区域运行,前面有一个 TCP 代理负载均衡器。负载均衡器的后端位于其中一个区域内的单个节点上。使用健康检查,负载均衡器可以确定将流量发送到何处。当流量源自 Google 之外时,这可以按预期工作。对于传出流量,我们使用 NAT 网关和优先级低于默认 Google 路由(800 而不是 1000)的路由来实际将 0.0.0.0/0 的流量路由到那里。
但是,当与 TCP 负载均衡器的(活动)后端不在同一区域的后端服务器之一尝试访问外部地址时,它将发生连接超时。该路由似乎未被使用。如果请求来自与活动后端相同的区域,则它可以工作。nat 网关路由似乎未被使用。
当然,一种解决方案是确保所有区域中都有活动后端,但我们不想这样做。我们注意到的一件事是,当我们通过此外部 IP 地址从集群内部获取流量时,我们日志中的客户端 IP 地址似乎就是负载均衡器地址本身。有没有其他方法可以解决这个问题?这是预期行为还是我们可能错误配置了某些路由或防火墙?
答案1
您确定您使用的是 TCP 代理负载均衡器吗?因为如果您使用的是非代理负载均衡器,则预计您会看到此行为。
内部负载均衡器 (ILB) 不是客户端和后端实例之外的实际设备,而是作为客户端和服务器使用的软件定义网络的编程实现的。ILB 逻辑在客户端实现,但如果后端也是同一 ILB 的客户端,由于 ILB IP 地址是在后端实例上运行的客户 Google Compute Engine (GCE) 代理中配置的,因此数据包永远不会“到达”ILB,因为 GCE 代理直接在后端实例内处理数据包。
换句话说,ILB 在每个后端实例操作系统内部配置一个路由和一个 IP 地址。如果一个后端实例向 ILB 发出请求,该请求将保留在该实例内部,而不会路由到任何其他后端实例。
有关内部负载均衡器的文档可在此处找到关联。