Amazon ECS 任务放置约束 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon ECS 任务放置约束

任务放置约束是放置任务时会考虑的一条规则。必须至少有一个容器实例匹配约束条件。如果没有与约束条件匹配的实例,则任务将保持 PENDING 状态。创建新服务或更新现有服务时,您可以为服务的任务指定任务放置限制。您也可以为独立任务指定任务放置约束。有关更多信息,请参阅Amazon ECS 任务放置

约束由约束类型和集群查询语言中的表达式组成。约束类型是必填项,但表达式是可选项。

约束类型

Amazon ECS 支持以下类型的任务放置约束:

distinctInstance

将每项任务放置在不同的容器实例中。可以在运行任务或创建新服务时指定此任务放置约束。

memberOf

将任务放置在满足表达式的容器实例中。有关约束表达式语法的更多信息,请参阅集群查询语言

可以使用以下操作指定 memberOf 任务放置约束:

  • 运行任务

  • 创建新服务

  • 创建新的任务定义

  • 创建现有任务定义的新修订版本

Attributes

您可以将自定义元数据添加到容器实例中,称为属性。每个属性都有一个名称和一个可选字符串值。您可以使用 Amazon ECS 提供的内置属性,或自定义属性。

以下部分包含示例内置、可选属性和自定义属性。

内置属性

Amazon ECS 会自动将以下属性应用于您的容器实例。

ecs.ami-id

用于启动实例的 AMI 的 ID。本属性的示例值为 ami-1234abcd

ecs.availability-zone

实例所在的可用区。本属性的示例值为 us-east-1a

ecs.instance-type

实例的实例类型。本属性的示例值为 g2.2xlarge

ecs.os-type

实例的操作系统。此属性的可能值为 linuxwindows

ecs.os-family

实例的操作系统版本。

对于 Linux 实例,有效值为 LINUX。对于 Windows 实例,ECS 以 WINDOWS_SERVER_<OS_Release>_<FULL or CORE> 格式设置值。有效值为 WINDOWS_SERVER_2022_FULLWINDOWS_SERVER_2022_COREWINDOWS_SERVER_20H2_COREWINDOWS_SERVER_2019_FULLWINDOWS_SERVER_2019_COREWINDOWS_SERVER_2016_FULL

这对于 Windows 容器很重要, Windows containers on Amazon Fargate 因为每个 Windows 容器的操作系统版本都必须与主机的操作系统版本相匹配。如果容器映像的 Windows 版本与主机不同,则容器无法启动。有关更多信息,请参阅 Microsoft 文档网站上的 Windows 容器版本兼容性

如果您的集群运行多个 Windows 版本,则可以使用置放约束来确保将任务放在运行相同版本的 EC2 实例上:memberOf(attribute:ecs.os-family == WINDOWS_SERVER_<OS_Release>_<FULL or CORE>)。有关更多信息,请参阅检索经 Amazon ECS 优化的 AMI 元数据

ecs.cpu-architecture

实例的 CPU 架构。本属性的示例值为 x86_64arm64

ecs.vpc-id

启动实例的 VPC。本属性的示例值为 vpc-1234abcd

ecs.subnet-id

实例正在使用的子网。本属性的示例值为 subnet-1234abcd

可选属性

Amazon ECS 可能会将以下属性添加到您的容器实例。

ecs.awsvpc-trunk-id

如果此属性存在,则实例具有中继网络接口。有关更多信息,请参阅弹性网络接口中继

ecs.outpost-arn

如果此属性存在,则包含 Outpost 的 Amazon Resource Name (ARN)。有关更多信息,请参阅Amazon 弹性容器服务开启 Amazon Outposts

ecs.capability.external

如果此属性存在,则实例将标识为外部实例。有关更多信息,请参阅外部实例 (Amazon ECS Anywhere)

自定义属性

您可以将自定义属性应用于您的容器实例。例如,您可以定义名为 "stack"、值为 "prod" 的属性。

指定自定义属性时,必须考虑以下内容。

  • name 必须包含 1 到 128 个字符,名称可以包含字母(大写和小写形式)、数字、连字符、下划线、正斜杠、反斜杠或句点。

  • value 必须包含 1 到 128 个字符,可以包含字母(大写和小写形式)、数字、连字符、下划线、句点、符号 (@)、正斜杠、反斜杠、冒号或空格。该值不能包含任何前导空格或尾随空格。

添加属性

您可以使用 Amazon Web Services Management Console,在实例注册时使用容器代理添加或手动添加自定义属性。有关可用的 Amazon ECS 容器代理配置参数的信息,请参阅上的 Amazon ECS 容器代理 GitHub。

使用控制台添加自定义属性
  1. https://console.aws.amazon.com/ecs/v2 打开控制台。

  2. 在导航窗格中,选择集群,然后选择该集群。

  3. 选择基础架构

  4. 选择容器实例,然后选择属性

  5. 选择添加自定义属性

  6. 对于属性名称,请输入属性的名称和值,然后选择提交

    对您要添加的每个属性重复此操作。

使用添加自定义属性 Amazon CLI

以下示例说明了如何使用 put-attributes 命令添加自定义属性。

示例:单个属性

以下示例将自定义属性 "stack=prod" 添加到默认集群的指定容器实例中。

aws ecs put-attributes --attributes name=stack,value=prod,targetId=arn
示例:多个属性

以下示例将自定义属性 "stack=prod" 和 "project=a" 添加到默认集群的指定容器实例中。

aws ecs put-attributes --attributes name=stack,value=prod,targetId=arn name=project,value=a,targetId=arn

使用控制台按属性筛选

您可以为容器实例应用筛选条件,从而能够查看自定义属性。

使用控制台按属性筛选容器实例
  1. https://console.aws.amazon.com/ecs/v2 打开控制台。

  2. 在导航窗格中,选择集群,然后选择该集群。

  3. 选择基础设施

  4. 选择容器实例。

  5. 使用按键或值筛选自定义属性文本字段,输入要作为筛选条件的属性。格式必须是AttributeName:AttributeValue.

使用按属性筛选容器实例 Amazon CLI

以下示例演示如何使用list-constainer-instances命令按属性筛选容器实例。有关筛选语法的更多信息,请参阅集群查询语言

示例:内置属性

以下示例使用内置属性列出 g2.2xlarge 实例。

aws ecs list-container-instances --filter "attribute:ecs.instance-type == g2.2xlarge"
示例:自定义属性

以下示例列出了具有自定义属性 "stack=prod" 的实例。

aws ecs list-container-instances --filter "attribute:stack == prod"
示例:排除属性值

以下示例列出了具有自定义属性 "stack",且其值仅为 "prod" 的实例。

aws ecs list-container-instances --filter "attribute:stack != prod"
示例:多个属性值

以下示例使用内置属性列出 t2.smallt2.medium 类型的实例。

aws ecs list-container-instances --filter "attribute:ecs.instance-type in [t2.small, t2.medium]"
示例:多个属性

以下示例使用内置属性列出 us-east-1a 可用区中的 T2 实例。

aws ecs list-container-instances --filter "attribute:ecs.instance-type =~ t2.* and attribute:ecs.availability-zone == us-east-1a"

约束示例

下面是一些任务放置约束示例。

此示例使用 memberOf 约束在 T2 实例上放置任务。可以通过以下操作进行指定:CreateServiceUpdateServiceRegisterTaskDefinition、和RunTask

"placementConstraints": [ { "expression": "attribute:ecs.instance-type =~ t2.*", "type": "memberOf" } ]

该示例使用 memberOf 约束将任务放置在进程守护程序服务 daemon-service 任务组中具有任务的实例上,同时考虑到同时指定的任何任务放置策略。此约束可确保进程守护程序服务任务在副本服务任务之前放置在 EC2 实例上。

daemon-service 替换为进程守护程序服务的名称。

"placementConstraints": [ { "expression": "task:group == service:daemon-service", "type": "memberOf" } ]

该示例使用 memberOf 约束将任务放置在 databases 任务组中具有其他任务的实例上,同时考虑到也指定的任何任务放置策略。有关任务组的更多信息,请参阅 任务组。可以通过以下操作进行指定:CreateServiceUpdateServiceRegisterTaskDefinition、和RunTask

"placementConstraints": [ { "expression": "task:group == databases", "type": "memberOf" } ]

distinctInstance 约束将组中的每项任务放置于不同实例上。可以通过以下操作进行指定:CreateServiceUpdateService、和 RunTask

"placementConstraints": [ { "type": "distinctInstance" } ]