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

awsvpc 网络模式的任务联网

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

注意

有关对任务可用的其他网络模式的信息,请参阅 网络模式

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

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

如果您的账户、IAM 用户或角色已选择使用 awsvpcTrunking 账户设置,并且您已启动具有增加的 ENI 密度的容器实例,则 Amazon ECS 还会为您的容器实例创建和附加“中继”网络接口。中继网络接口完全由 Amazon ECS 管理。在您从 Amazon ECS 集群中终止或取消注册容器实例时,将删除中继 ENI。有关选择使用 awsvpcTrunking 账户设置的更多信息,请参阅 使用具有增加的 ENI 限制的容器实例

任务联网方面的考量

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

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

    aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com
  • Amazon ECS 允许使用具有增加的 ENI 密度的受支持的 Amazon EC2 实例类型来启动容器实例。当您使用这些实例类型并选择使用 awsvpcTrunking 账户设置时,新启动的容器实例将具有更高的 ENI 限制。此配置允许您在每个容器实例上放置更多任务。有关选择使用 awsvpcTrunking 账户设置的更多信息,请参阅 账户设置。有关 ENI 中继的更多信息,请参阅 弹性网络接口中继

  • 您的 Amazon ECS 容器实例需要至少 1.15.0 版的容器代理才能启用任务联网。要利用增加的 ENI 密度与中继功能,容器实例至少需要 1.28.1 版本的容器代理。但是,我们建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。如果您使用的是 Amazon ECS-optimized AMI,则实例至少需要 1.15.0-4(或面向 ENI 中继功能的 1.28.1-2)版本的 ecs-init 程序包。有关更多信息,请参阅Amazon ECS-optimized AMI

  • 目前,只有Amazon ECS-optimized AMI 的 Linux 变体,或具有 ecs-init 程序包的其他 Amazon Linux 变体支持任务联网。

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

    注意

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

  • 每个使用 awsvpc 网络模式的 Amazon ECS 任务都会接收到自己的 ENI,该 ENI 将附加到托管它的容器实例。可以附加到 Amazon EC2 实例的网络接口的数量有默认限制,并且主网络接口计为一个。例如,默认情况下,最多可将三个 ENI 附加到一个 c5.large 实例。实例的主网络接口计为一个,因此您可以向该实例再附加 2 个 ENI。由于每个使用 awsvpc 网络模式的任务均需一个 ENI,因此,您通常只能在该实例类型上运行 2 个此类任务。有关每个实例类型的默认 ENI 限制的更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的每个实例类型的每个网络接口的 IP 地址

  • Amazon ECS 支持使用受支持的 Amazon EC2 实例类型启动已增加 ENI 密度的容器实例。当您使用这些实例类型并选择使用 awsvpcTrunking 账户设置时,其他 ENI 将在新启动的容器实例上可用。此配置允许您使用 awsvpc 网络模式在每个容器实例上放置更多任务。通过使用此功能,启用了 awsvpcTrunkingc5.large 实例的 ENI 限制提高了 12。容器实例将具有主网络接口,而 Amazon ECS 将创建一个“中继”网络接口并将此接口附加到容器实例。因此,此配置允许您在容器实例上启动 10 个任务,而不是当前的两个任务。有关更多信息,请参阅弹性网络接口中继

  • 在运行任务或创建使用 awsvpc 网络模式的服务时,限制为可在 awsvpcConfiguration 中指定 16 个子网和 5 个安全组。有关更多信息,请参阅 Amazon Elastic Container Service API Reference 中的 AwsVpcConfiguration

  • Amazon ECS 仅考虑附加到您的容器实例的 ENI。如果已手动将 ENI 附加到容器实例,则 Amazon ECS 可能会尝试在可用网络适配器附件太少的情况下将任务放置在实例上。在这种情况下,任务会超时,将从 PROVISIONING 变为 DEPROVISIONING,然后变为 STOPPED。我们建议您不要手动将 ENI 附加到容器实例。

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

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

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

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

  • 如果 VPC 已更新,例如更改所使用的 DHCP 选项集,并且您希望在使用该 VPC 的任务中使更改生效,则必须停止这些任务并启动新任务。

启用任务联网

要让任务使用任务联网,您必须在任务定义中指定 awsvpc 网络模式。有关更多信息,请参阅网络模式。然后,当您运行任务或创建服务时,请指定网络配置,其中包含要放置任务的一个或多个子网以及要附加到其关联的 ENI 的一个或多个安全组。这些任务放置在与这些子网位于相同可用区中的有效容器实例上,并且指定的安全组与为该任务预配置的 ENI 关联。