为什么我的 Amazon ECS 服务中正在运行的任务计数发生了变化?

上次更新日期:2022 年 4 月 4 日

我的 Amazon Elastic Container Service (Amazon ECS) 服务中正在运行的任务计数已增加或减少。

简短描述

由于多种原因,您的 Amazon ECS 服务的运行任务计数可能会增加或减少。以下是一些常见原因:

  • 您的 Amazon ECS 任务未通过运行状况检查。
  • AWS CloudFormation 或 AWS 云开发工具包 (AWS CDK) 更新了 ECS 服务中的所需计数。
  • 您手动更新了您的 ECS 服务的所需计数。
  • Amazon ECS 服务弹性伸缩根据扩展策略更新了任务数量。
  • 您使用 RegisterScalableTarget API 更新了应用程序弹性伸缩中的最小或最大计数。
  • 您的 ECS 服务的部署配置修改了部署期间正在运行的任务计数。

解决方法

您的 ECS 任务未通过运行状况检查

CloudFormation 或 AWS CDK 更新了您的 ECS 服务中的所需计数

如果您在未指定 DesiredCount 字段的情况下使用 CloudFormation 或 CDK 创建了 ECS 服务,则所需的计数将设置为默认值 1。但是,如果在未指定 DesiredCount 字段的情况下通过 CloudFormation 或 CDK 更新服务,则当前部署中现有的所需计数将用于新部署。

要排查这个问题,请查看 AWS CloudTrail 事件 以查明 UpdateService API 调用是否由 CloudFormation 完成执行。您可以通过检查事件记录部分中的 userAgent 字段是否指定了以下内容来验证这一点:

"userAgent": "cloudformation.amazonaws.com"

要解决此问题,请在更新期间从CloudFormation 或 CDK 代码中移除 desiredCount 参数。

您手动更新了您的 ECS 服务的所需计数

如果您使用 UpdateService API、Amazon ECS 控制台或 AWS Command Line Interface (AWS CLI) 手动更新了 ECS 服务,请再次更新该服务,将所需的计数更改为适当的值。有关详细信息,请参阅更新某项服务update-service

要排查这个问题,请参阅 CloudTrail 事件以查明 UpdateService API 调用是否通过 Amazon ECS 控制台或 AWS CLI 完成。您可以在 CloudTrail 记录的 userAgent 字段中查看此信息。

示例:

"userAgent": "console.amazonaws.com"

Amazon ECS 服务弹性伸缩根据扩展策略更新了任务数量

根据扩缩策略,Amazon ECS 服务弹性伸缩可能已增加或减少了所需的计数。查看服务并检查最近是否有任何扩缩活动。

要查看扩缩活动,请执行以下操作:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 选择要检查的集群。
  4. 选择 Services(服务)选项卡。
  5. 选择要检查的服务。
  6. 选择 Events(事件)选项卡。

如果存在扩缩事件,则可以在 Message(消息)列中查看信息性消息,如下所示:

Successfully set desired count to 1. Change successfully fulfilled by ecs. Cause: monitor alarm TargetTracking-service/service-autoscaling/sample-webapp-AlarmLow-fcd80aef-5161-4890-aeb4-35dde11ff42c in state ALARM triggered policy TargetTrackingPolicy.

如果任务由于扩缩活动而停止,请查看目标跟踪步骤扩缩策略。然后,根据应用程序的要求更新所需的计数。

要查看应用程序弹性伸缩配置,请执行以下操作:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 选择要检查的集群。
  4. 选择 Services(服务)选项卡。
  5. 选择要检查的服务。
  6. 选择 Auto Scaling(弹性伸缩)选项卡。
    注意:如果您使用的是新的 Amazon ECS 控制台,请选择配置和任务,然后查看服务配置下的信息。

您使用 RegisterScalableTarget API 更新了应用程序弹性伸缩中的最小和最大计数

如果使用 RegisterScalableTarget API 更新可扩展目标,请检查 API 中指定的 MinCapacity 属性值。如果您指定了新的最小值,则应用程序弹性伸缩将使用此值作为任务可以缩减到的新最小值。

注意:应用程序弹性伸缩不会将所需计数缩减到小于指定的最小值。

您的 ECS 服务的部署配置修改了部署期间正在运行的任务计数

查看 CloudTrail 事件以检查最近是否调用了 UpdateService API。您可以通过在 UpdateService API 中查看 deploymentConfigration 请求参数来查看您的 ECS 服务的部署配置 。

-或者-

通过执行以下操作,在 Amazon ECS 控制台中查看您的 ECS 服务的部署配置:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 选择要检查的集群。
  4. 选择 Services(服务)选项卡。
  5. 选择要检查的服务。
  6. 选择 Deployments(部署)选项卡。

部署配置参数控制部署期间运行的任务数量以及停止和启动任务的顺序。如果部署配置设置不正确,则部署期间运行的任务数量将减少。因此,最佳做法是将 minimumHealthyPercent 参数的值配置为大于 0%。

minimumHealthyPercent 参数表示以下任一条件的下限,以服务所需任务数的百分比表示:

  • 部署期间应为服务运行的任务数
  • 容器实例耗尽时应运行的任务数。

此参数的值向上舍入。例如,如果 minimumHealthyPercent 为 50%,所需的任务数为四个,则调度器可以在启动两个新任务之前停止两个现有任务。如果 minimumHealthyPercent 为 75%,而所需的任务数为两个,则调度器无法停止任何任务,因为结果值也是两个。

maximumPercent 参数表示以下任一条件的上限,表示服务所需任务数的百分比:

  • 部署期间应为服务运行的任务数
  • 容器实例耗尽时应运行的任务数。

此参数的值向下舍入。例如,如果 maximumPercent 为 200%,所需的任务数为四个,则调度器可以在停止四个现有任务之前启动四个新任务。如果 maximumPercent 为 125%,而所需的任务数为三,则调度器无法启动任何任务,因为结果值也是三。

有关详细信息,请参阅 Rolling update(滚动更新)。