我有以下 AWS 设置:
- 具有 2 个 EC2 实例的 ECS 集群,每个实例在不同 AZ 内的自己的子网中运行
- 几个微服务,它们只运行每个任务,因为它们是有状态的
- 一个内部应用程序负载均衡器,每个微服务的目标组按端口映射
现在想象以下场景:服务 1 想要与在另一个 AZ 中的另一个 EC2 实例上运行的服务 2 通信。作为服务 2 的 URL,我使用负载均衡器的 DNS 名称和端口:internal-load-balancer:8082/path
。这是必要的,因为我正在使用滚动部署,因此每次部署后微服务在两个 EC2 实例之间移动。
现在,如果我执行host internal-load-balancer
,我会返回 2 个 IP 地址,一个用于运行在子网 1 中的负载均衡器,一个用于运行在子网 2 中:
- 10.0.0.11
- 10.0.32.11
如果我现在在服务 1 上执行以下 curl 命令:
curl 10.0.0.11:8082/
我找回了网关超时curl 10.0.32.11:8082/
按预期工作,我得到了 200curl 10.0.32.10:8082/
也有效
那么,如果我在同一个子网中使用负载均衡器而不是在另一个子网中,那么为什么这会起作用呢?如果我直接联系其他 AZ 中的 EC2 实例,它也可以工作。问题是 DNS 记录解析为两个 IP 地址,而微服务只是随机使用其中一个,所以我的一半请求在另一半超时。
那么我在这里做错了什么???在此先感谢您的支持:)