【问题标题】:Coordinating multiple VMs in a VPC协调 VPC 中的多个虚拟机
【发布时间】:2018-03-03 00:48:34
【问题描述】:

我正在使用部署 3 个 EC2 虚拟机的 CloudFormation 堆栈。每个都需要配置为能够通过 IP 或主机名发现其他 2 个,这无关紧要。

Amazon 的私有内部 DNS 似乎非常无用,因为它基于 IP 地址,在配置时无法知道。因此,我无法使用我在 CloudFormation 堆栈时所知道的内容来配置节点。

据我所知,我有几个选择。在我看来,所有这些都比必要的复杂 - 还有其他选择吗?

  1. 使用 Route53,设置私有 DNS 托管区域,为每个连接到其网络接口的 VM 创建一个条目,然后通过命名条目,我应该提前知道我分配给它们的私有 DNS .
  2. 启动另一个服务,让 3 个虚拟机在初始化后“回拨”,然后向他们报告谁准备好了。
  3. 想出一些其他基于 VM 的 shell 魔术,并做一些愚蠢的事情,比如使用 nmap 扫描本地子网中某个端口上的活动机器。

在我使用过的其他云(如 GCP)上,当您配置 VM 时,它会根据部署模板中的资源名称获取内部 DNS 名称,这使得此类问题非常简单。男孩,我希望我有那个。

这里最好的方法是什么? (1) 看起来很简单,但要求使用我的堆栈的人拥有他们并不真正需要的额外权限。 (2) 是有点浪费的额外资源使用。 (3) 看起来……很傻。

【问题讨论】:

  • 您可以在启动每个 EC2 实例时为其请求一个特定的私有 IP,如果您更喜欢这种方法。或者您可以更改主机名(请参阅docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-hostname.html)。
  • @jarmod 更改主机名似乎不是一种选择;在 VM 本地工作,但其他 VM 无法解析该主机名。私有 IP,看起来确实可行,并且类似于 (1),因为它需要配置/支付/许可新资源。

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

使用 Route53,设置私有 DNS 托管区域,为每个连接到其网络接口的虚拟机创建一个条目,然后为条目命名

这是最好的解决方案,但有一个更简单的实现方式。

  1. 为您的每台机器指定一个“资源名称”。
  2. 在 CloudFormation 堆栈中,创建一个 AWS::Route53::RecordSet 资源,该资源将基于该“资源名称”的主机名通过其逻辑 ID 与 EC2 实例相关联。
  3. 在您的应用程序中,使用基于资源名称的主机名来访问其他实例。

另一种方法是使用 Application Load Balancer,将您的应用程序实例放在不同的目标组中。然后,各种 EC2 实例通过 ALB 发送所有流量,因此您只有一个需要传播的引用(它可以存储在 EC2 实例的 UserData 中)。但这还有很多工作要做。

这假设您已经设置了私有托管区域。

【讨论】:

    【解决方案2】:

    我认为您所说的就是服务发现。

    如果您将 EC2 实例部署在同一 VPC 中的同一子网中,并使用相同的安全组允许希望通过该端口进行通信,则它们将是“可发现的”。

    然后您可以更进一步。如果自动缩放在组上并且机器死亡并重生,它们可以将 IP 写入注册表,即发电机,以便其他机器知道在哪里可以找到它们。

    【讨论】:

    • Elasticsearch 有一个 EC2 插件可以做到这一点 - 它使用实例元数据和标记来发现其他节点。
    • 是的,我肯定在谈论服务发现。你说的是真的,但是如果没有额外的服务,如何被发现?节点1如何预测节点2和3的网络位置?这就是问题——不仅仅是如何使它成为可能。
    猜你喜欢
    • 2015-06-22
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多