协调 VPC 中的多个虚拟机
Coordinating multiple VMs in a VPC
我正在使用部署 3 个 EC2 VM 的 CloudFormation 堆栈。每个都需要配置为能够通过 IP 或主机名发现其他 2 个,这无关紧要。
Amazon 的私有内部 DNS 似乎非常无用,因为它基于 IP 地址,在配置时无法获知。因此,我无法仅使用我在 CloudFormation 堆栈时间知道的内容来配置节点。
据我所知,我有几个选择。在我看来,所有这些都比必要的更复杂 - 还有其他选择吗?
- 使用 Route53,设置私有 DNS 托管区域,为连接到其网络接口的每个 VM 创建一个条目,然后通过命名条目,我应该提前知道我分配的私有 DNS给他们。
- 启动另一个服务让 3 个虚拟机 "phone home" 初始化后,然后可以向它们报告谁准备好了。
- 想出一些其他基于 VM 的 shell 魔术,并做一些愚蠢的事情,例如使用 nmap 扫描本地子网以查找某个端口上活动的机器。
在我使用的其他云(如 GCP)上,当您配置 VM 时,它会根据其在部署模板中的资源名称获得一个内部 DNS 名称,这使得此类问题变得非常微不足道。男孩,我希望我有那个。
最好的方法是什么? (1) 看起来很简单,但要求使用我的堆栈的人拥有他们并不真正需要的额外权限。 (2) 是有点浪费的额外资源使用。 (3) 看起来……好傻。
Use Route53, set up a private DNS hosted zone, make an entry for each of the VMs which is attached to their network interface, and then by naming the entries
这是最好的解决方案,但还有一个更简单的实现。
- 给你的每台机器一个"resource name"。
- 在 CloudFormation 堆栈中,创建一个
AWS::Route53::RecordSet
资源,该资源将基于 "resource name" 的主机名通过其逻辑 ID 关联到 EC2 实例。
- 在您的应用程序中,使用 resource-name-based 主机名访问其他实例。
另一种方法是使用 Application Load Balancer,将您的应用程序实例放在单独的目标组中。然后,各种 EC2 实例通过 ALB 发送所有流量,因此您只有一个需要传播的引用(它可以存储在 EC2 实例的 UserData 中)。但这还有很多工作要做。
这假定您已经设置了私有托管区域。
我想你所说的就是所谓的服务发现。
如果您将 EC2 实例部署在同一个 VPC 的同一个子网中,并使用同一个安全组,允许端口进行通信,它们将 "discoverable" 彼此。
然后您可以更进一步。如果自动缩放在组上并且机器死亡并重生,他们可以将那里的 IP 写入注册表,即发电机,以便其他机器知道在哪里可以找到它们。
我正在使用部署 3 个 EC2 VM 的 CloudFormation 堆栈。每个都需要配置为能够通过 IP 或主机名发现其他 2 个,这无关紧要。
Amazon 的私有内部 DNS 似乎非常无用,因为它基于 IP 地址,在配置时无法获知。因此,我无法仅使用我在 CloudFormation 堆栈时间知道的内容来配置节点。
据我所知,我有几个选择。在我看来,所有这些都比必要的更复杂 - 还有其他选择吗?
- 使用 Route53,设置私有 DNS 托管区域,为连接到其网络接口的每个 VM 创建一个条目,然后通过命名条目,我应该提前知道我分配的私有 DNS给他们。
- 启动另一个服务让 3 个虚拟机 "phone home" 初始化后,然后可以向它们报告谁准备好了。
- 想出一些其他基于 VM 的 shell 魔术,并做一些愚蠢的事情,例如使用 nmap 扫描本地子网以查找某个端口上活动的机器。
在我使用的其他云(如 GCP)上,当您配置 VM 时,它会根据其在部署模板中的资源名称获得一个内部 DNS 名称,这使得此类问题变得非常微不足道。男孩,我希望我有那个。
最好的方法是什么? (1) 看起来很简单,但要求使用我的堆栈的人拥有他们并不真正需要的额外权限。 (2) 是有点浪费的额外资源使用。 (3) 看起来……好傻。
Use Route53, set up a private DNS hosted zone, make an entry for each of the VMs which is attached to their network interface, and then by naming the entries
这是最好的解决方案,但还有一个更简单的实现。
- 给你的每台机器一个"resource name"。
- 在 CloudFormation 堆栈中,创建一个
AWS::Route53::RecordSet
资源,该资源将基于 "resource name" 的主机名通过其逻辑 ID 关联到 EC2 实例。 - 在您的应用程序中,使用 resource-name-based 主机名访问其他实例。
另一种方法是使用 Application Load Balancer,将您的应用程序实例放在单独的目标组中。然后,各种 EC2 实例通过 ALB 发送所有流量,因此您只有一个需要传播的引用(它可以存储在 EC2 实例的 UserData 中)。但这还有很多工作要做。
这假定您已经设置了私有托管区域。
我想你所说的就是所谓的服务发现。
如果您将 EC2 实例部署在同一个 VPC 的同一个子网中,并使用同一个安全组,允许端口进行通信,它们将 "discoverable" 彼此。
然后您可以更进一步。如果自动缩放在组上并且机器死亡并重生,他们可以将那里的 IP 写入注册表,即发电机,以便其他机器知道在哪里可以找到它们。