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

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

Amazon ECS 任务放置约束

任务放置约束是在任务放置期间考虑的规则。可以在运行任务或创建新服务时指定任务放置约束。也可以针对现有服务更新任务放置约束。有关更多信息,请参阅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.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

如果此属性存在,则它包含 Amazon Resource Name (ARN) 的 Outpost. 有关更多信息,请参阅Amazon Elastic Container Service,发布时间:AWS Outposts.

自定义属性

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

指定自定义属性时,应考虑以下事项。

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

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

添加属性

您可以使用 ,在实例注册时使用容器代理添加或手动添加自定义属性。AWS 管理控制台. 有关使用容器代理的更多信息,请参阅 Amazon ECS 容器代理配置参数.

使用控制台添加自定义属性

  1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

  2. 在导航窗格中,选择 Clusters (集群),然后选择一个集群。

  3. 在 ECS Instances (ECS 实例) 选项卡上,选中容器实例的复选框。

  4. 选择 ActionsView/Edit Attributes.

  5. 对于每个属性,请执行以下操作:

    1. 选择 Add attribute.

    2. 键入属性的名称和值,然后选中复选标记图标。

  6. 属性添加完毕后,选择 Close.

使用 添加自定义属性AWS 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.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

  2. 选择具有容器实例的集群。

  3. 选择 ECS Instances.

  4. 通过选择齿轮图标 ( 设置列可见性首选项 ) 并选择要显示的属性。此设置将在与您的账户关联的所有容器集群中保留。

  5. 使用 Filter by attributes (按属性筛选) 文本字段,键入或选择要作为筛选条件的属性。格式必须为 AttributeName:AttributeValue

    对于 Filter by attributes (按属性筛选),键入或选择要作为筛选条件的属性。在选择属性名称后,系统会提示您提供属性值。

  6. 根据需要向筛选条件添加其他属性。通过选择属性旁边的 X 来删除属性。

使用 按属性筛选容器实例AWS 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"

任务组

您可以将一组相关任务组成任务组. 在执行分布放置时,具有相同任务组名称的所有任务均被视为一组。例如,假设一个集群中运行着不同应用程序,如数据库和 Web 服务器。为确保您的数据库在各可用区之间达到平衡,请将它们添加到名为 "databases" 的任务组,然后使用此任务组约束任务放置。

当您使用 RunTaskStartTask 操作启动任务时,可以为该任务指定任务组名称。如果没有为该任务指定任务组,默认名称是任务定义的系列名称(例如,family:my-task-definition).

对于服务计划程序启动的任务,任务组名称是服务的名称(例如,service:my-service-name).

Limits

  • 任务组名称必须为 255 个字符或更少。

  • 每项任务只能处于一个组中。

  • 任务启动后,您将无法修改其任务组。

约束示例

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

此示例使用 memberOf 约束在 T2 实例上放置任务。可以使用以下操作指定它CreateService:、、 UpdateService RegisterTaskDefinition RunTask

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

该示例使用 memberOf 约束将任务放置在具有databases任务组中其他任务的实例上,并遵循同样指定的任何任务放置策略。可以使用以下操作指定它CreateService:、、 UpdateService RegisterTaskDefinition RunTask

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

distinctInstance 约束将组中的每项任务放置于不同实例上。可以使用以下操作指定它CreateService:、 UpdateService RunTask

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