设置
我在 Google 云平台上运行 Linux 虚拟机,它们位于外部 TCP 转发负载均衡器。负载均衡器的工作方式是将 TCP 流量原封不动地转发到健康实例(不修改 IP 地址)。为了确保负载均衡器转发的流量被虚拟机接受,Google 的 guest-agent 默认会使用以下命令将条目添加到本地路由表:
ip route add to local LOADBALANCERIP/32 dev eth0 proto 66
当前行为
虽然这实现了接受转发流量的主要目标,但它有一个缺点:从目标实例到负载均衡器 IP 的 TCP 连接永远不会离开该实例,因为 IP 位于本地路由表中。
想要的行为
是否有可能(使用路由、iptables 或其他方式)接受传入TCP 连接,同时允许传出流量去往负载均衡器?
我想要这样做的原因如下:考虑在目标实例(在我的情况下是 Kubernetes 控制平面)上运行的服务,该服务是负载均衡器的目标。在相同的实例上运行的其他程序也需要连接到健康的服务实例。出于 HA 目的,我想确保在同一实例上运行的其他程序可以将流量路由到健康的服务实例。使用当前配置,即使本地服务实例不健康,主服务的流量也将始终在本地路由。
解决方案评估
我考虑过的一个解决方案是使用代理负载均衡器。但这有其他缺点(主要问题是仅允许一组狭窄的端口)。
答案1
ip route add to main LOADBALANCERIP/32 dev eth0 proto 66