awsvpc 网络模式 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

awsvpc 网络模式

awsvpc 网络模式提供的任务联网功能使 Amazon ECS 任务具有与 Amazon EC2 实例相同的联网属性。使用awsvpc网络模式可以简化容器联网,因为您可以更好地控制应用程序彼此通信的方式,以及 VPC 中其他服务的通信方式。awsvpc网络模式还允许您在任务中更精细地使用安全组和网络监控工具,从而为您的容器提供更高的安全性。您还可以使用其他 Amazon EC2 联网功能(例如 VPC 流日志)来监控进出任务的流量。此外,属于同一任务的容器可以通过 localhost 接口进行通信。

任务 elastic network interface (ENI) 是 Amazon ECS 的一项完全托管功能。Amazon ECS 创建 ENI 并将它附加到具有指定安全组的 Amazon EC2 实例。任务在 ENI 上发送和接收网络流量的方式与 Amazon EC2 实例使用其主要网络接口的方式相同。预设情况下,每个任务 ENI 都会分配一个专用 IPv4 地址。如果您的 VPC 启用了双堆栈模式,并且您使用带有 IPv6 CIDR 块的子网,则任务 ENI 也将收到 IPv6 地址。每个任务只能有一个 ENI。

这些 ENI 可在您的账户的 Amazon EC2 控制台中显示。您的账户无法分离或修改 ENI。这是为了防止意外删除与正在运行的任务关联的 ENI。您可以在 Amazon ECS 控制台中或DescribeTasks通过 API 操作查看任务的 ENI 附件信息。当任务停止或服务缩减时,将分离并删除任务 ENI。

当您需要增加 ENI 密度时,请使用awsvpcTrunking账户设置。Amazon ECS 还会为您的容器实例创建并连接一个 “中继” 网络接口。中继网络接口完全由 Amazon ECS 托管。在您从 Amazon ECS 集群中终止或注销容器实例时,将删除中继 ENI。有关awsvpcTrunking账户设置的更多信息,请参阅先决条件

您可以在任务定义的networkMode参数awsvpc中指定。有关更多信息,请参阅网络模式

然后,在运行任务或创建服务时,使用包含一个或多个子网的networkConfiguration参数将任务放入并使用一个或多个安全组附加到 ENI。有关更多信息,请参阅网络配置。这些任务放置在与这些子网相同的可用性区域中的兼容 Amazon EC2 实例上,并且指定的安全组与为该任务预置的 ENI 相关联。

Linux 注意事项

在使用 Linux 操作系统时考虑以下事项。

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

    aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com
  • 您的 Amazon EC2 Linux 实例需要版本 1.15.0 或更高版本的容器代理运行使用 awsvpc 网络模式。如果您正在使用经 Amazon ECS 优化的 AMI,您的实例将需要不低于 1.15.0-4 版本的 ecs-init 程序包。

  • 在 VPC 上启用 enableDnsHostnamesenableDnsSupport 选项时, Amazon ECS使用任务联网和 Amazon 提供的(内部)DNS 主机名来填充任务的主机名。如果未启用这些选项,则任务的 DNS 主机名将被设置为随机主机名。有关 VPC 的 DNS 设置的更多信息,请参阅《Amazon VPC 用户指南》中的在 VPC 中使用 DNS

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

  • Amazon ECS 支持使用支持的实例类型启动 Amazon EC2 Linux 实例,并增加 ENI 密度。当您选择加入 awsvpcTrunking 账户设置并将使用这些实例类型的 Amazon EC2 Linux 实例注册到集群时,这些实例具有更高的 ENI 配额。将这些实例与此更高配额结合使用意味着您可以在每个 Amazon EC2 Linux 实例上放置更多的任务。为了将增加的 ENI 密度与中继功能结合使用,您的 Amazon EC2 实例必须使用版本 1.28.1 或更高版本的容器代理。如果您正在使用经 Amazon ECS 优化的 AMI,您的实例将还需要不低于版本 1.28.1-2ecs-init 软件包。有关选择使用 awsvpcTrunking 账户设置的更多信息,请参阅 通过账户设置访问 Amazon ECS 的功能。有关 ENI 中继的更多信息,请参阅弹性网络接口中继

  • 当在 Amazon EC2 Linux 实例上托管使用 awsvpc 网络模式的任务时,不会为您的任务 ENI 提供公有 IP 地址。要访问互联网,必须在配置为使用 NAT 网关的私有子网中启动任务。有关更多信息,请参阅《Amazon VPC 用户指南》中的 NAT 网关。入站网络访问必须从使用私有 IP 地址的 VPC 内进行,或者通过 VPC 内的负载均衡器进行路由。在公有子网中启动的任务无法访问互联网。

  • Amazon ECS 仅为您识别连接到 Amazon EC2 Linux 实例的 ENI。如果您手动将 ENI 附加到您的实例,Amazon ECS 可能会尝试向没有足够网络适配器的实例添加任务。这可能会导致任务超时并转为取消预置状态,然后变为已停止状态。我们建议您不要手动将 ENI 附加到实例。

  • Amazon EC2 Linux 实例必须注册到可以考虑在 awsvpc 网络模式下放置任务的 ecs.capability.task-eni 功能。运行版本 1.15.0-4 或更高版本的 ecs-init 的实例注册自动有此属性。

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

  • 在运行任务或创建使用 awsvpc 网络模式的服务时,限制为可在 awsVpcConfiguration 中指定 16 个子网和 5 个安全组。有关更多信息,请参阅AwsVpcConfiguration亚马逊弹性容器服务 API 参考》。

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

  • 任务使用 awsvpc 网络模式的服务只支持应用程序负载均衡器和网络负载均衡器。当您为这些服务创建任何目标组时,必须选择 ip 作为目标类型。切勿使用 instance。这是因为使用 awsvpc 网络模式的任务与 ENI 而不是 Amazon EC2 Linux 实例关联。有关更多信息,请参阅服务负载均衡

  • 如果您的 VPC 进行了更新以更改其使用的 DHCP 选项集,则无法将这些更改应用于现有任务。在应用这些更改的情况下启动新任务,验证它们是否正常工作,然后停止现有任务以安全地更改这些网络配置。

Windows 注意事项

以下是使用 Windows 操作系统时的注意事项:

  • 使用经 Amazon ECS 优化的 Windows Server 2016 AMI 的容器实例无法托管使用 awsvpc 网络模式的任务。如果您的集群包含经 Amazon ECS 优化的 Windows Server 2016 AMI 和支持 awsvpc 网络模式的 Windows AMI,则使用 awsvpc 网络模式的任务不会在 Windows 2016 Server 实例上启动。而是会在支持 awsvpc 网络模式的实例上启动。

  • 您的 Amazon EC2 Windows 实例需要容器代理版本1.57.1或更高版本才能使用使用awsvpc网络模式的 Windows 容器的 CloudWatch 指标。

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

    aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com
  • 您的 Amazon EC2 Windows 实例需要版本 1.54.0 或更高版本的容器代理运行使用 awsvpc 网络模式。在引导实例时,必须配置 awsvpc 网络模式所需的选项。有关更多信息,请参阅使用 Amazon EC2 用户数据引导 Windows 容器实例

  • 在 VPC 上同时启用 enableDnsHostnamesenableDnsSupport 选项时,Amazon ECS 会使用 Amazon 提供的(内部)DNS 主机名来填充任何主机名。如果未启用这些选项,则任务的 DNS 主机名为随机主机名。有关 VPC 的 DNS 设置的更多信息,请参阅《Amazon VPC 用户指南》中的在 VPC 中使用 DNS

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

  • 当在 Amazon EC2 Windows 上托管使用 awsvpc 网络模式时,不会为您的任务 ENI 提供公有 IP 地址。要访问互联网,请在配置为使用 NAT 网关的私有子网中启动任务。有关更多信息,请参阅《Amazon VPC 用户指南》中的 NAT 网关。入站网络访问必须使用私有 IP 地址从 VPC 内进行,或者通过 VPC 内的负载均衡器进行路由。在公有子网中启动的任务无法访问互联网。

  • Amazon ECS 仅为您识别已附加到 Amazon EC2 Windows 实例的 ENI。如果您手动将 ENI 附加到您的实例,Amazon ECS 可能会尝试向没有足够网络适配器的实例添加任务。这可能会导致任务超时并转为取消预置状态,然后变为已停止状态。我们建议您不要手动将 ENI 附加到实例。

  • Amazon EC2 Windows 实例必须注册到可以考虑在 awsvpc 网络模式下放置任务的 ecs.capability.task-eni 功能。

  • 您不能手动修改或分离创建并连接到 Amazon EC2 Windows 实例的 ENI。这是为了防止您意外删除与正在运行的任务关联的 ENI。要释放任务的 ENI,请停止该任务。

  • 当运行任务或创建使用 awsvpc 网络模式的服务时,您最多只能在 awsVpcConfiguration 中指定 16 个子网和 5 个安全组。有关更多信息,请参阅AwsVpcConfiguration亚马逊弹性容器服务 API 参考》。

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

  • 任务使用 awsvpc 网络模式的服务只支持应用程序负载均衡器和网络负载均衡器。当您为这些服务创建任何目标组时,必须选择 ip 而不是 instance 作为目标类型。这是因为使用 awsvpc 网络模式的任务与 ENI 而不是 Amazon EC2 Linux Windows 关联。有关更多信息,请参阅服务负载均衡

  • 如果您的 VPC 进行了更新以更改其使用的 DHCP 选项集,则无法将这些更改应用于现有任务。在应用这些更改的情况下启动新任务,验证它们是否正常工作,然后停止现有任务以安全地更改这些网络配置。

  • 在 EC2 Windows 配置中使用 awsvpc 网络模式时,不支持以下内容:

    • 双堆栈配置

    • IPv6

    • ENI 中继

在双堆栈模式下使用 VPC

在双堆栈模式下使用 VPC 时,您的任务可以通过 IPv4 或 IPv6 或两者进行通信。IPv4 和 IPv6 地址是相互独立的。因此,您必须在 VPC 中分别为 IPv4 和 IPv6 配置路由和安全。有关如何将 VPC 配置为双堆栈模式的更多信息,请参阅《Amazon VPC 用户指南》 中的迁移到 IPv6

如果您使用互联网网关或仅出站互联网网关配置 VPC,则可以在双堆栈模式下使用 VPC。通过这样做,分配了 IPv6 地址的任务可以通过互联网网关或仅限出口的互联网网关访问互联网。NAT 网关是可选项。有关更多信息,请参阅 Amazon VPC 用户用户指南中的互联网网关Egress-only 互联网网关

如果满足以下条件,则向 Amazon ECS 任务分配 IPv6 地址:

  • 托管该任务的 Amazon EC2 Linux 实例正在使用版本 1.45.0 或更高版本的容器代理。有关如何检查您的实例正在使用的代理版本以及根据需要进行更新的信息,请参阅更新 Amazon ECS 容器代理

  • dualStackIPv6 帐户设置为已启用。有关更多信息,请参阅通过账户设置访问 Amazon ECS 的功能

  • 您的任务是使用 awsvpc 网络模式。

  • 您的 VPC 和子网已为 IPv6 配置。配置包括在指定子网中创建的网络接口。有关如何将 VPC 配置为双堆栈模式的更多信息,请参阅《Amazon VPC 用户指南》中的迁移到 IPv6为您的子网修改 IPv6 寻址属性