Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

awsvpc 网络模式的任务联网

awsvpc 网络模式提供的任务联网功能使 Amazon ECS 任务具有与 Amazon EC2 实例相同的联网属性。当您在任务定义中使用 awsvpc 网络模式时,每个从该任务定义启动的任务都会获取其自己的弹性网络接口、主要私有 IP 地址和内部 DNS 主机名。任务联网功能简化了容器联网,使您可以更好地控制容器化应用程序如何与您的 VPC 内的其他服务进行通信。

通过允许您在 ECS 任务中更精细地使用安全组和网络监视工具,任务联网还为您的容器提供了更高的安全性。由于每个任务都有自己的弹性网络接口,因此您也可以利用其他 Amazon EC2 联网功能 (例如 VPC 流日志),以便您可以监控您任务的流量。此外,属于同一任务的容器可以通过 localhost 接口进行通信。一个任务在给定的时间只能有一个与之相关的弹性网络接口。

要使用任务联网,请在您的任务定义中指定 awsvpc 网络模式。然后,当您运行任务或创建服务时,请指定网络配置,其中包含要放置任务的子网和要附加到关联弹性网络接口的安全组。这些任务放置在这些子网中的有效容器实例上,并且指定的安全组与该任务预置的弹性网络接口相关联。

为您的任务创建的弹性网络接口完全由 Amazon ECS 管理。Amazon ECS 创建弹性网络接口并将其附加到具有指定安全组的容器实例。任务在弹性网络接口上发送和接收网络流量的方式与 Amazon EC2 实例使用其主要网络接口的方式相同。这些弹性网络接口在您账户的 Amazon EC2 控制台中可见,但它们不能由您的账户手动分离或修改。这是为了防止意外删除与正在运行的任务相关的弹性网络接口。您可以在 Amazon ECS 控制台中查看任务的弹性网络接口连接信息,或 DescribeTasks API 操作。当任务停止或服务缩减时,弹性网络接口将被释放。

启用任务联网

您的 Amazon ECS 容器实例需要至少 1.15.0 版的容器代理才能启用任务联网。但是,我们建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。如果您正在使用经 Amazon ECS 优化的 AMI,您的实例至少需要 1.15.0-4 版的 ecs-init 程序包。如果您的容器实例是从版本 2017.09.a 或更高版本启动的,那么这些实例将包含所需版本的容器代理和 ecs-init。有关更多信息,请参阅 经 Amazon ECS 优化的 AMI

重要

当前,只有 ecs-init 程序包中经 Amazon ECS 优化的 AMI 或其他 Amazon Linux 变体才支持任务联网。

要使用任务联网,您的任务定义必须指定 awsvpc 网络模式。有关更多信息,请参阅 网络模式。当您使用指定 awsvpc 网络模式的任务定义运行任务或创建服务时,您可以指定一个网络配置,其中包含要考虑放置的 VPC 子网以及要附加到任务弹性网络接口的安全组。

使用 awsvpc 网络模式的任务和服务需要与 Amazon ECS 服务相关的角色,来向 Amazon ECS 提供代表您调用其他 AWS 服务的权限。此角色是在创建群集时 (或者在 AWS 管理控制台 中创建或更新服务时) 自动为您创建的。有关更多信息,请参阅 为 Amazon ECS 使用服务相关角色。您也可以使用以下 AWS CLI 命令创建服务相关的角色:

aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com

任务联网方面的考量

使用任务联网时,需要考虑多个因素。

  • 对于使用 EC2 启动类型的任务,awsvpc 网络模式不提供具有公有 IP 地址的任务弹性网络接口。要访问 Internet,必须在配置为使用 NAT 网关的私有子网中启动使用 EC2 启动类型的任务。有关更多信息,请参阅 Amazon VPC 用户指南 中的 NAT 网关。入站网络访问必须使用私有 IP 地址或 DNS 主机名从 VPC 内进行,或者通过 VPC 内的负载均衡器进行路由。公有子网内启动的任务不具有出站网络访问权限。

    注意

    上述限制不适用于使用 FARGATE 启动类型的任务。您可以对这些任务进行配置,以接收公有 IP 地址。

  • 当前,只有 ecs-init 程序包中经 Amazon ECS 优化的 AMI 或其他 Amazon Linux 变体才支持任务联网。您的 Amazon ECS 容器实例需要至少 1.15.0 版的容器代理才能启用任务联网。我们建议使用最新的容器代理版本。

  • 使用 awsvpc 网络模式的每个任务都会接收到自己的弹性网络接口,该网络接口附加到托管该接口的容器实例。EC2 实例对可以附加到它们的弹性网络接口数量有限制,并且主网络接口计为一个。例如,c4.large 实例可能最多可以附加 3 个弹性网络接口。实例的主要网络适配器计为一个,因此您可以向该实例再附加 2 个弹性网络接口。由于每个 awsvpc 任务都需要一个弹性网络接口,因此您只能在该实例类型上运行 2 个此类任务。有关每个实例类型支持的弹性网络接口数量的更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的每个实例类型的每个网络接口的 IP 地址

  • 在任务定义的 awsvpcConfiguration 部分中,限制为可以指定 10 个子网和 5 个安全组。

  • Amazon ECS 仅计算附加到您的容器实例的弹性网络接口。如果手动将弹性网络接口附加到容器实例,则 Amazon ECS 可能会尝试在没有足够的可用网络适配器附件的情况下将任务放置在实例上。在这种情况下,任务会超时,将从 PROVISIONING 变为 DEPROVISIONING,然后变为 STOPPED。我们建议您不要手动将弹性网络接口附加到您的容器实例。

  • 容器实例必须使用 ecs.capability.task-eni 注册,才能考虑使用 awsvpc 网络模式放置任务。运行版本 1.15.0-4 或更高版本的 ecs-init 的容器实例注册有此属性。

  • 创建并附加到容器实例的弹性网络接口不能由您的账户手动分离或修改。这是为了防止意外删除与正在运行的任务相关的弹性网络接口。要释放任务的弹性网络接口,请停止任务。

  • 在用 awsvpc 网络模式启动任务时,Amazon ECS 容器代理会为每个任务创建一个附加的 pause 容器,然后再在任务定义中启动该容器。然后,它通过执行 amazon-ecs-cni-plugins CNI 插件来配置 pause 容器的网络命名空间。然后,该代理会启动任务中的其余容器,以使其共享 pause 容器的网络堆栈。这意味着,一个任务中的所有容器均可通过弹性网络接口的 IP 地址来寻址,并且这些容器可以通过 localhost 接口相互通信。

  • 具有使用 awsvpc 网络模式的任务 (例如,那些 Fargate 启动类型的任务) 的服务仅支持 应用程序负载均衡器 和 网络负载均衡器;不支持 传统负载均衡器。此外,当您为这些服务创建任何目标组时,必须选择 ip 而不是 instance 作为目标类型。这是因为使用 awsvpc 网络模式的任务与弹性网络接口而不是 Amazon EC2 实例关联。有关更多信息,请参阅 服务负载均衡