在 Amazon ECS 上安排您的容器 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 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 自定义计划程序如何使用任务放置策略和约束放置任务。

自定义调度器

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

注意

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