在 Amazon ECS 上安排您的容器 - Amazon Elastic Container Service

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

在 Amazon ECS 上安排您的容器

Amazon Elastic Container Service (Amazon ECS) 是一个共享状态、乐观的并发系统,可为您的容器化工作负载提供灵活的调度功能。Amazon ECS 调度器利用由 Amazon ECS API 提供的相同群集状态信息来制定适当的放置决策。

Amazon ECS 提供用于长期运行的任务和应用程序的服务调度器。它还提供了为批处理作业或单次运行任务运行独立任务或计划任务的功能。您可以为运行最能满足您需求的任务指定任务放置策略和约束。例如,您可以指定任务是跨多个可用区运行,还是在单个可用区内运行。您还可以选择将任务集成到自己的自定义或第三方调度器。

服务调度器

服务调度器适用于长时间运行的无状态服务和应用程序。服务调度器可确保遵循您指定的计划策略并在任务失败时(例如,在底层基础设施因某个原因失败的情况下)重新计划任务。例如,如果底层基础结构出现故障,服务调度器可以重新安排任务。

在容器运行状况检查或负载均衡器目标组运行状况检查失败后,服务计划程序还会替换被确定为运行状况不佳的任务。此替换取决于 maximumPercentdesiredCount 服务定义参数。如果任务被标记为运行状况不佳,则服务计划程序将首先启动替换任务。如果替换任务的运行状况为 HEALTHY,则服务计划程序将停止运行状况不佳的任务。如果替换任务的运行状况为 UNHEALTHY,则计划程序将停止运行状况不佳的替换任务或现有的运行状况不佳任务,以使任务总数等于 desiredCount。如果 maximumPercent 参数限制计划程序先启动替换任务,则计划程序将一次随机停止一个运行状况不佳的任务以释放容量,然后启动替换任务。启动和停止过程将继续,直到所有运行状况不佳的任务都被运行状况正常的任务所替换。替换了所有运行状况不佳的任务并且只有运行正常的任务后,如果任务总数超过 desiredCount,则会随机停止运行状况正常的任务,直到任务总数等于 desiredCount。有关 maximumPercentdesiredCount 的更多信息,请参阅服务定义参数

注意

此行为不适用于使用滚动更新部署类型的服务所运行和维护的任务。在滚动更新期间,服务计划程序首先会停止运行状况不佳的任务,然后启动替换任务。

有两种服务计划程序策略可用:

  • REPLICA:副本计划策略在集群中放置和维护所需数量的任务。默认情况下,服务计划程序可在多个可用区之间分布任务,但您可以使用任务放置策略和约束自定义任务放置决策。有关更多信息,请参见 副本

  • DAEMON - 守护程序计划策略只在每个活动容器实例上部署一个任务,以满足您在集群中指定的所有任务放置约束。当使用此策略时,无需指定所需的任务数、任务放置策略,也无需使用服务 Auto Scaling 策略。有关更多信息,请参阅 。

    注意

    Fargate 任务不支持 DAEMON 计划策略。

此外,服务调度器可以选择性地确保针对 Elastic Load Balancing 负载均衡器注册任务。您可以更新由服务调度器维护的服务。这可能包括部署新的任务定义或更改正在运行的所需任务的数量。预设情况下,服务调度器可在多个可用区之间分布任务,但您可以使用任务放置策略和约束自定义任务放置决策。有关更多信息,请参见 Amazon ECS 服务

独立任务

RunTask 操作适用于诸如执行工作然后停止的批处理作业这样的流程。例如,您可以拥有在工作进入队列时调用 RunTask 的流程。任务从队列中拉取工作、执行工作,然后退出。使用 RunTask,您可以允许原定设置任务放置策略在集群中随机分配任务。这可以最大程度地减小单一实例获得不成比例数量任务的机会。您还可以使用 RunTask 自定义计划程序如何使用任务放置策略和约束放置任务。有关更多信息,请参阅创建独立任务亚马逊弹性容器服务 API 参考RunTask中的。

计划任务

以类似 cron 的计划运行任务

如果您的集群中有任务要按设定的间隔运行,则可以使用 S EventBridge cheduler 来创建计划。您可以为备份操作或日志扫描运行任务。您创建的 EventBridge 计划程序计划可以在指定时间在集群中运行一个或多个任务。您的调度事件可以设置为特定的时间间隔(每 N 分钟、小时或天运行一次)。否则,对于更复杂的调度,您可以使用 cron 表达式。有关更多信息,请参见 Amazon ECS 调度任务

自定义调度器

使用 Amazon ECS,您可以创建自己的调度器或使用第三方调度器。有关更多信息,请参阅如何为 Amazon ECS 创建自定义计划程序。自定义调度器使用 StartTaskAPI 操作在集群中的特定容器实例上放置任务。

注意

自定义调度器仅与 EC2 实例上托管的任务兼容。如果你在 Fargate 上使用 Amazon ECS,则该 StartTask API 不起作用。

任务生命周期

如果手动启动任务或将任务作为服务的一部分启动,则任务在自行完成或被手动停止之前可能经历多种状态。一些任务旨在作为批处理作业运行,将自然地依次经历 PENDINGRUNNINGSTOPPED 状态。可为服务的一部分的其他任务旨在无限期持续运行,或根据需要向上扩展和向上扩展。

当请求任务状态更改(如停止任务或更新所需服务计数以将其扩展或缩减)时,Amazon ECS 容器代理会根据任务的上一个已知状态 (lastStatus) 和任务的所需状态 (desiredStatus) 跟踪这些更改。任务的上一个已知状态和所需状态均可在控制台中或通过使用 API 或 AWS CLI 描述任务进行查看。

以下流程图显示任务生命周期流程。


                任务生命周期状态图。状态为 PROVISIONING、PENDING、ACTIVATING、RUNNING、DEACTIVATING、STOPPING。

生命周期状态

以下是每个任务生命周期状态的描述。

PROVISIONING (正在预置)

Amazon ECS 必须先执行其他步骤,然后再启动任务。例如,对于使用 awsvpc 网络模式的任务,需要预置弹性网络接口。

等待

这是一个过渡状态,其中 Amazon ECS 正在等待容器代理采取进一步操作。任务一直处于待处理状态,直到有可用资源可用于该任务。

ACTIVATING (正在激活)

这种一种过渡状态,在此状态下,Amazon ECS 必须在启动任务后但在任务可以过渡到 RUNNING 状态之前执行其他步骤。例如,对于已配置服务发现的任务,必须创建服务发现资源。对于配置为使用多个 Elastic Load Balancing 目标组的服务所包含的任务,在此状态下将注册目标组。

RUNNING (正在运行)

任务正在成功运行。

DEACTIVATING (正在停用)

这种一种过渡状态,在此状态下,Amazon ECS 必须在任务停止前执行其他步骤。例如,对于配置为使用多个 Elastic Load Balancing 目标组的服务所包含的任务,在此状态下将注册目标组。

STOPPING (正在停止)

这是一个过渡状态,其中 Amazon ECS 正在等待容器代理采取进一步操作。

对于 Linux 容器,容器代理将发送 SIGTERM 信号通知应用程序需要完成并关闭,然后在等待任务定义中设置的 StopTimeout 持续时间后发送 SIGKILL

DEPROVISIONING (正在取消预置)

Amazon ECS 必须在已停止任务后但在任务过渡到 STOPPED 状态之前执行其他步骤。例如,对于使用 awsvpc 网络模式的任务,需要分离并删除弹性网络接口。

STOPPED (已停止)

任务已成功停止。

DELETED

这是任务停止时的过渡状态。此状态不会显示在控制台中,而是显示在 describe-tasks 中。