Amazon ECS 服务 - Amazon Elastic Container Service

Amazon ECS 服务

您可以使用 Amazon ECS 服务在 Amazon ECS 集群中同时运行和维护指定数量的任务定义实例。如果其中一个任务失败或停止,Amazon ECS 服务调度器会启动另一个任务定义实例来替换它。这有助于保持服务中的预期任务数。

您也可选择在负载均衡器后面运行服务。负载均衡器将在与服务关联的各个任务间分配流量。

我们建议您将服务调度器用于长时间运行的无状态服务和应用程序。服务调度器可确保遵循您指定的计划策略并在任务失败时(例如,在底层基础设施因某个原因失败的情况下)重新计划任务。例如,如果底层基础设施出现故障,服务调度器会重新安排任务。您可以使用任务放置策略和约束来自定义调度器的任务放置和终止方式。如果服务中的某个任务停止,调度器将启动一个新的任务来替代它。此过程将一直持续,直到服务根据服务使用的调度策略达到预期任务数。服务的调度策略也称为服务类型

在容器运行状况检查或负载均衡器目标组运行状况检查失败后,服务计划程序还会替换被确定为运行状况不佳的任务。此替换取决于 maximumPercentdesiredCount 服务定义参数。如果任务被标记为运行状况不佳,则服务计划程序将首先启动替换任务。然后会发生以下情况。

  • 如果替换任务的运行状况为 HEALTHY,则服务计划程序将停止运行不正常的任务

  • 如果替换任务的运行状况为 UNHEALTHY,则计划程序将停止运行状况不佳的替换任务或现有的运行状况不佳任务,以使任务总数等于 desiredCount

如果 maximumPercent 参数限制计划程序先启动替换任务,则计划程序将一次随机停止一个运行状况不佳的任务以释放容量,然后启动替换任务。启动和停止过程将继续,直到所有运行状况不佳的任务都被运行状况正常的任务所替换。替换了所有运行状况不佳的任务并且只有运行正常的任务后,如果任务总数超过 desiredCount,则会随机停止运行状况正常的任务,直到任务总数等于 desiredCount。有关 maximumPercentdesiredCount 的更多信息,请参阅服务定义参数

服务调度器包括用来限制任务反复启动失败后重新启动的频率的逻辑。如果一个任务尚未进入 RUNNING 状态便停止,则服务调度程序会开始降低启动尝试的速度,并发出服务事件消息。此行为可防止在您解决问题之前将不必要的资源用于失败的任务。服务更新后,服务调度器会恢复正常调度行为。有关更多信息,请参阅Amazon ECS 服务节流逻辑查看 Amazon ECS 服务事件消息

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

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

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

    注意

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

进程守护程序策略

守护程序 计划策略只在每个活动容器实例上部署一个任务,以满足集群中指定的所有任务放置约束。服务调度器会评估运行任务的任务放置约束,并停止不满足放置约束的任务。使用此策略时,无需指定预期任务数、任务放置策略,也无需使用 Service Auto Scaling 策略。

Amazon ECS 为进程守护程序任务保留容器实例计算资源,包括 CPU、内存和网络接口。当您在具有其他副本服务的集群上启动进程守护程序服务时,Amazon ECS 会优先考虑进程守护程序任务。这意味着进程守护程序任务是在实例上启动的第一个任务,也是在所有副本任务停止后要停止的最后一个任务。此策略确保资源不会被待处理的副本任务使用,并且可用于进程守护程序任务。

进程守护程序服务调度器不会将任何任务放置在具有 DRAINING 状态的实例上。如果容器实例转换为 DRAINING 状态,容器实例上的进程守护程序任务会停止。此服务计划程序还监视何时将新容器实例添加到您的集群,并将守护程序任务添加到其中。

当指定了部署配置时,则 maximumPercent 参数的值必须为 100(以百分比形式指定),如果未设置,则是使用的默认值。minimumHealthyPercent 参数的默认值为 0(以百分比形式指定)。

更改进程守护程序服务的放置约束时,您必须重新启动该服务。Amazon ECS 会动态更新预留在符合条件的实例上进程守护程序任务的资源。对于现有实例,调度器尝试将任务放在实例上。

当任务定义中的任务大小或容器资源预留变更时,会启动新部署。Amazon ECS 为守护程序选取更新后的 CPU 和内存预留,然后阻止该守护程序任务的容量。

如果没有足够的资源用于上述任一情况,则会发生以下情况:

  • 任务放置失败。

  • 将生成一个 CloudWatch 事件。

  • Amazon ECS 通过等待资源变为可用,继续尝试并计划实例上的任务。

  • Amazon ECS 释放不再符合放置约束条件的所有预留实例,并停止相应的守护进程任务。

守护进程调度策略可用于以下情况:

  • 运行应用程序容器

  • 运行用于记录、监视和跟踪任务的支持容器

使用 Fargate 启动类型或 CODE_DEPLOYEXTERNAL 部署控制器类型的任务不支持守护程序调度策略。

当服务计划程序停止运行任务时,它将尝试在您的群集的可用区之间保持平衡。该计划程序使用以下逻辑:

  • 如果已定义放置策略,请使用该策略来选择要终止的任务。例如,如果服务已定义可用区分布策略,则会选择一项任务终止,以让剩余任务保持最佳分布。

  • 如果尚未定义放置策略,请使用以下逻辑在集群中的可用区之间保持平衡:

    • 对有效容器实例进行排序。优先考虑在各自的可用区中具有此服务的最大运行任务数的实例。例如,如果 A 区有 1 个运行服务任务,B 区和 C 区各有 2 个运行服务任务,则 B 区或 C 区中的容器实例被认为最适合终止任务。

    • 基于之前的步骤,停止最佳可用区中容器实例上的任务。优先使用具有此服务的最大运行任务数的容器实例。

副本策略

副本 计划策略在集群上放置并维护所需数量的任务。

对于在 Fargate 上运行任务的服务,当服务调度器启动新任务或停止运行任务时,服务调度器会尽力尝试在可用区之间保持平衡。无需指定任务放置策略或约束。

创建在 EC2 实例上运行任务的服务时,您还可选择指定任务放置策略和约束来自定义任务放置决策。如果未指定任务放置策略或约束,则默认情况下,服务调度器会在可用区之间分布任务。该调度器使用以下逻辑:

  • 确定集群中的哪些容器实例可支持服务的任务定义(例如,所需的 CPU、内存、端口和容器实例属性)。

  • 确定哪些容器实例满足为该服务定义的任何放置约束。

  • 如果您的副本服务依赖于进程守护程序服务(例如,在任务可以使用日志记录之前需要运行的进程守护进程日志路由器任务),请创建一个任务放置约束,确保进程守护程序服务任务在副本服务任务开始之前放置在 EC2 实例上。有关更多信息,请参阅 Amazon ECS 任务放置约束示例

  • 若已定义放置策略,请使用该策略,从剩余候选项中选择一个实例。

  • 如果尚未定义放置策略,请使用以下逻辑来平衡集群中各个可用区的任务:

    • 对有效容器实例进行排序。优先考虑在各自的可用区中具有此服务的最小运行任务数的实例。例如,如果 A 区有一个正在运行的服务任务,B 区和 C 区都没有正在运行的服务任务,则认为在 B 区或 C 区中的有效容器实例中最适合放置任务。

    • 基于之前的步骤,将新的服务任务放置在最佳可用区中的有效容器实例上。优先使用具有此服务的最小运行任务数的容器实例。