互连 Amazon ECS 服务 - Amazon Elastic Container Service

互连 Amazon ECS 服务

在 Amazon ECS 任务中运行的应用程序通常需要接收来自互联网的连接或连接到在 Amazon ECS 服务中运行的其他应用程序。如果您需要来自互联网的外部连接,我们建议您使用 Elastic Load Balancing。有关集成负载均衡的更多信息,请参阅 使用负载均衡分配 Amazon ECS 服务流量

如果您需要一个应用程序来连接到在 Amazon ECS 服务中运行的其他应用程序,Amazon ECS 会提供以下无需负载均衡器的方法来实现此目的:

  • Amazon ECS Service Connect

    建议使用 Service Connect,它为服务发现、连接和流量监控提供 Amazon ECS 配置。借助 Service Connect,您的应用程序可以使用短名称和标准端口连接到同一集群中的 Amazon ECS 服务,也可以连接到其他集群(包括同一 AWS 区域 的不同 VPC 中)中的 Amazon ECS 服务。

    当您使用 Service Connect 时,Amazon ECS 会管理服务发现的所有部分:创建可发现的名称,在任务开始和停止时动态管理每个任务的条目,在配置为发现名称的每个任务中运行代理。您的应用程序可以通过使用 DNS 名称的标准功能,并建立连接来查找这些名称。如果您的应用程序已执行此操作,则您无需修改应用程序即可使用 Service Connect。

    您在每项服务和任务定义中都提供完整的配置。Amazon ECS 在每个服务部署中管理对该配置的更改,以确保部署中的所有任务以相同的方式运行。例如,DNS 作为服务发现的一个常见问题是控制迁移。如果您将 DNS 名称更改为指向新的替换 IP 地址,则在所有客户端开始使用新服务之前,可能需要最大的 TTL 时间。使用 Service Connect,客户端部署将通过替换客户端任务来更新配置。您可以像配置任何其他部署一样配置部署断路器和其他部署配置,以对 Service Connect 更改造成影响。

    有关更多信息,请参阅 使用 Service Connect 连接具有短名称的 Amazon ECS 服务

  • Amazon ECS 服务发现

    服务间通信的另一种方法是使用服务发现进行直接通信。在这种方法中,您可以使用与 Amazon ECS 的 AWS Cloud Map 服务发现集成。使用服务发现,Amazon ECS 将已启动的任务列表同步到 AWS Cloud Map,后者将维护一个 DNS 主机名,该主机名解析为来自该特定服务的一个或多个任务的内部 IP 地址。Amazon VPC 中的其他服务可以使用此 DNS 主机名,以通过其内部 IP 地址将流量直接发送到另一个容器。

    这种服务间的通信方法可实现低延迟。容器之间没有额外的组件。流量直接从一个容器传递到另一个容器。

    这种方法适用于使用 awsvpc 网络模式时,在这种模式下,每项任务都有自己唯一的 IP 地址。大多数软件仅支持使用 DNS A 记录,这些记录可直接解析为 IP 地址。使用 awsvpc 网络模式时,每项任务的 IP 地址都是一个 A 记录。但是,如果您使用 bridge 网络模式,则多个容器可能会共享相同的 IP 地址。此外,动态端口映射会导致容器在该单个 IP 地址上被随机分配端口号。此时,A 记录已不足以进行服务发现。您还必须使用 SRV 记录。这种类型的记录可以同时跟踪 IP 地址和端口号,但需要您相应地配置应用程序。您使用的某些预建应用程序可能不支持 SRV 记录。

    awsvpc 网络模式的另一个优点是,您的每项服务都有一个唯一的安全组。您可以将此安全组配置为只允许来自需要与该服务通信的特定上游服务的传入连接。

    使用服务发现进行服务间直接通信的主要缺点是,您必须实现额外的逻辑才能进行重试和处理连接失败。DNS 记录具有生存时间(TTL),可控制其缓存时长。更新 DNS 记录和缓存过期需要一些时间,这样您的应用程序可以获取 DNS 记录的最新版本。因此,您的应用程序最终可能会将 DNS 记录解析为指向另一个不再存在的容器。您的应用程序需要处理重试,并具有忽略不良后端的逻辑。

    有关更多信息,请参阅 使用服务发现连接具有 DNS 名称的 Amazon ECS 服务

网络模式兼容性表

下表介绍了这些选项与任务网络模式之间的兼容性。在表中,“客户端”是指从 Amazon ECS 任务内部建立连接的应用程序。

互连选项 已进行桥接 awsvpc Host
服务发现 是的,但要求客户端知道 DNS 中没有 hostPort 的 SRV 记录。 是的,但要求客户端知道 DNS 中没有 hostPort 的 SRV 记录。
Service Connect