Amazon ECS 服务 - Amazon Elastic Container Service

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

Amazon ECS 服务

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

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

服务计划程序概念

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

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

注意

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

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

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

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

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

    注意

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

守护程序

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

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

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

如果指定了部署配置,则最大百分比参数必须为 100。的守护程序服务的默认值maximumPercent为 200%。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 区中的有效容器实例中最适合放置任务。

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

附加服务概念

  • 您可选择借助负载均衡器运行您的服务。有关更多信息,请参阅 使用负载平衡分配 Amazon ECS 服务流量

  • 您可选择为您的服务指定部署配置。通过更新服务的任务定义或来启动部署。在部署期间,服务计划程序将使用最小正常百分比最大百分比 参数来确定部署策略。有关更多信息,请参阅 服务定义参数

  • 您可以选择配置您的服务以使用 Amazon ECS 服务发现。服务发现使用 AWS Cloud Map 自动命名 API 来管理服务任务的 DNS 条目。因此,可在 VPC 中发现服务任务。有关更多信息,请参阅 服务发现

  • 删除服务后,如果仍有需要清除的运行任务,服务会从 ACTIVE 转变为 DRAINING 状态,并且服务在控制台或 ListServices API 操作中不再可见。所有任务都转换为 STOPPINGSTOPPED 状态后,服务会从 DRAINING 转变为 INACTIVE 状态。您可以使用 DescribeServices API 操作查看处于 DRAININGINACTIVE 状态的服务。但是,将来可能会从 Amazon ECS 记录中清理和清除 INACTIVE 服务,并且这些服务上的 DescribeServices 调用会返回 ServiceNotFoundException 错误。

  • 烘焙时间是指新服务版本横向扩展和旧服务版本横向缩减之后的一段时间,在此期间,Amazon ECS 继续监控与部署关联的警报。Amazon ECS 根据与部署关联的警报配置计算此时间段。

    仅当您使用 CloudWatch 警报检测部署失败时,烘焙时间才适用。有关更多信息,请参阅 故障检测方法