【发布时间】:2019-12-17 20:58:33
【问题描述】:
我有以下 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/按预期工作,我得到了 200 -
curl 10.0.32.10:8082/也有效
那么,如果我在同一个子网中使用负载均衡器而不是在另一个子网中,那么为什么这会起作用呢?如果我直接联系其他 AZ 中的 EC2 实例,它也可以工作。问题是 DNS 记录解析为两个 IP 地址,而微服务只是随机使用其中一个,所以我的一半请求在另一半超时。
那么我在这里做错了什么??? 在此先感谢您的支持:)
【问题讨论】:
-
FWIW 我在 AWS 中设置了一个基本的并行示例,我的示例正在运行,所以我认为没有任何理论问题。我唯一能想到的是 - 您的 EC2 实例上的安全组是否可以设置为允许基于其他 EC2 实例的安全组成员身份而不是 IP 地址进行访问?如果由于 sec 组成员身份而允许 10.0.0.10 访问 10.0.32.10 并且允许 10.0.32.0/19 但不允许 10.0.0.0/19 - 理论上可以这样做(我认为)。
-
感谢您试用 :) 我刚刚在 StackOverflow (stackoverflow.com/questions/9257514/amazon-elb-in-vpc) 上遇到了这个问题,这似乎解决了我的问题 :D 所以我所做的就是将 LB 从私有子网对公众开放,现在它不知道有什么区别或为什么这是必要的......也许是 AWS 方面的一些错误,或者它应该以这种方式工作
标签: amazon-web-services amazon-ec2 amazon-ecs aws-application-load-balancer