服务事件消息 - Amazon Elastic Container Service

服务事件消息

如果您正在解决与服务相关的问题,首先应查看服务事件日志中的诊断信息。您可以使用 DescribeServices API、AWS CLI 或 AWS Management Console 查看服务事件。

使用 Amazon ECS API 查看服务事件消息时,仅返回服务调度器中的事件。这些包括最近的任务放置和实例运行状况事件。但是,Amazon ECS 控制台显示来自以下来源的服务事件。

  • 来自 Amazon ECS 服务调度器的任务放置和实例运行状况事件。这些事件的前缀为服务(服务名称)。为了确保此事件视图有帮助,我们只显示 100 最近的事件,并忽略重复的事件消息,直到问题得到解决或过去六个小时。如果在六小时内未解决问题,您将收到另一条关于该原因的维修事件消息。

  • 服务 Auto Scaling 事件。这些事件的前缀为消息10 将显示最近扩展的事件。只有在使用 Application Auto Scaling 扩展策略配置服务时,才会发生这些事件。

可以使用以下步骤查看您当前的服务事件消息。

New console
  1. https://console.aws.amazon.com/ecs/v2 打开控制台。

  2. 在导航窗格中,选择 Clusters

  3. Clusters(集群)页面上,选择集群。

  4. 选择要检查的服务。

  5. 选择 Deployments and events(部署和事件),在 Events(事件)下查看消息。

Classic console
  1. 打开 https://console.aws.amazon.com/ecs/ 上的 Amazon ECS 控制台。

  2. 集群 页面上,选择已停止的任务所在的集群。

  3. Cluster : clustername (集群: <集群名称>) 页面上,选择 Tasks (任务)

  4. Desired task status (预期任务状态) 表标题中,选择 Stopped (已停止),然后选择要检查的已停止任务。首先列出最近停止的任务。

  5. 详细信息部分中,检查停止原因字段以查看导致任务停止的原因。

    下面列出了一些可能的原因及它们的解释:

    (elb elb-name)中的 ELB 运行状况检查任务失败

    当前任务未通过针对与任务的服务关联的负载均衡器的 Elastic Load Balancing 运行状况检查。有关更多信息,请参阅服务负载均衡器问题排查

    (deployment deployment-id)发起的扩展活动

    当您减少稳定服务的预期数量时,必须停止一些任务才能达到预期数量。通过缩小服务规模停止的任务具有此停止原因。

    主机 EC2(instance ‭‬id‭‬)已停止/终止

    如果您停止或终止一个具有正在运行的任务的容器实例,这些任务将获得此停止原因。

    用户强制执行的容器实例取消注册

    如果您强制取消注册一个具有正在运行的任务的容器实例,这些任务将获得此停止原因。

    已退出任务中的必需容器

    如果任务定义中标记为 essential 的容器退出或发生故障,则将导致任务停止。如果主要容器退出是导致任务停止的原因,则 步骤 6 会提供有关导致容器停止的原因的更多诊断信息。

  6. 如果您有一个已停止的容器,请展开该容器并检查 Status reason 行,以查看导致任务状态发生更改的原因。

    在上一个示例中,找不到容器映像名称。如果您拼错了映像名称,则会发生此情况。

    如果此检查提供的信息不足,您可以使用 SSH 连接到容器实例并在本地检查 Docker 容器。有关更多信息,请参阅检查 Docker 容器

AWS CLI

使用 describe-services 命令查看指定服务的服务事件消息。

以下 AWS CLI 示例描述了原定设置群集中 service-name 服务,它将提供最新的服务事件消息。

aws ecs describe-services \ --cluster default \ --services service-name \ --region us-west-2

服务事件消息

以下是您可能会在 Amazon ECS 控制台中看到的服务事件消息的示例:

当服务正常运行且任务数量为期望值,从而达到稳定状态时,服务计划程序将发送 service (service-name) has reached a steady state. 服务事件。

服务调度器会定期报告状态,因此您可能会多次收到此消息。

当服务计划程序找不到添加其他任务的可用资源时,它将发送此事件消息。导致出现此情况的可能原因是:

未在您的集群中找到任何容器实例

如果未向您尝试在其中运行任务的集群注册任何容器实例,您将收到此错误。您应向集群添加容器实例。有关更多信息,请参阅启动 Amazon ECS Linux 容器实例

端口不足

如果您的任务使用固定主机端口映射(例如,您的任务对 Web 服务器使用主机上的端口 80),则每个任务必须至少有一个容器实例,因为一次仅一个容器可以使用一个主机端口。您应向集群添加容器实例,或减少所需的任务数。

注册的端口过多

用于任务放置的最密切匹配的容器实例不能超过允许的最大保留端口限制,即每个容器实例 100 个主机端口。使用动态主机端口映射可能会修复此问题。

端口已在使用

此任务的任务定义在其端口映射中使用与已在选择运行的容器实例上运行的任务相同的端口。服务事件消息将包含选定的容器实例 ID 作为下面消息的一部分。

The closest matching container-instance is already using a port required by your task.
内存不足

如果您的任务定义指定 1000 MiB 的内存,并且集群中的每个容器实例均具有 1024 MiB 的内存,则只能为每个容器实例运行此任务的一个副本。您可以在任务定义中尝试更少的内存,以便为每个容器实例启动多个任务,或者在集群中启动更多容器实例。

注意

如果您尝试通过为任务提供尽可能多的用于特定实例类型的内存来最大程度地利用资源,请参阅容器实例内存管理

CPU 不足

一个容器实例中,每个 CPU 核心有 1,024 个 CPU 单元。如果您的任务定义指定 1,000 个 CPU 单元,并且集群中的每个容器实例均具有 1,024 个 CPU 单元,则只能为每个容器实例运行此任务的一个副本。您可以在任务定义中尝试更少的 CPU 单元,以便为每个容器实例启动多个任务,或者在集群中启动更多容器实例。

没有足够的可用 ENI 附加点

每个使用 awsvpc 网络模式的任务都会收到自己的弹性网络接口 (ENI),且会附加到托管任务的容器实例。Amazon EC2 实例对可以附加到它们的 ENI 数量有限制,并且集群中没有带可用 ENI 容量的容器实例。

单个容器实例的 ENI 限制取决于以下条件:

  • 如果您尚未选择使用 awsvpcTrunking 账户设置,则每个容器实例的 ENI 限制取决于实例类型。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的每个实例类型的每个网络接口的 IP 地址

  • 如果您选择使用 awsvpcTrunking 账户设置,但您在选择使用后启动使用支持的实例类型的新容器实例,则每个容器实例的 ENI 限制仍将为原定设置值。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的每个实例类型的每个网络接口的 IP 地址

  • 如果您选择使用 awsvpcTrunking 账户设置,并且您在选择使用后启动使用支持的实例类型的新容器实例,则其他 ENI 将可用。有关更多信息,请参阅支持 Amazon EC2 实例类型

有关选择使用 awsvpcTrunking 账户设置的更多信息,请参阅 弹性网络接口中继

您可以将容器实例添加到您的集群以提供更多可用的网络适配器。

容器实例缺少必需属性

一些任务定义参数需要在容器实例上安装特定的 Docker 远程 API 版本。其他任务定义(例如,日志记录驱动程序选项)需要容器实例使用 ECS_AVAILABLE_LOGGING_DRIVERS 代理配置变量注册这些日志记录驱动程序。如果您的任务定义包含一个需要特定容器实例属性的参数,并且您没有可满足此要求的任何可用容器实例,则无法放置任务。

造成此错误的常见原因是,您的服务正在使用的任务使用的是 awsvpc 网络模式和 EC2 启动类型,并且您指定的集群中没有在服务创建时在 awsvpcConfiguration 中指定的同一子网中注册的容器实例。

有关特定任务定义参数和代理配置变量所需的属性的更多信息,请参阅任务定义参数Amazon ECS 容器代理配置

用于放置任务的最接近的匹配容器实例不会容纳足够的 CPU 单位来满足任务定义中的要求。查看任务定义的任务大小和容器定义参数中的 CPU 要求。

用于任务放置的最近匹配容器实例上的 Amazon ECS 容器代理已断开连接。如果您可以通过 SSH 连接到容器实例,则可以查看代理日志;有关更多信息,请参阅 Amazon ECS 容器代理日志。您还应验证代理是否正在该实例上运行。如果您使用的是经 Amazon ECS 优化的 AMI,则可以尝试通过以下命令停止并重新启动代理。

  • 对于经 Amazon ECS 优化的 Amazon Linux 2 AMI

    sudo systemctl restart ecs
  • 对于经 Amazon ECS 优化的 Amazon Linux AMI

    sudo stop ecs && sudo start ecs

此服务已注册到一个负载均衡器,并且未通过负载均衡器运行状况检查。有关更多信息,请参阅服务负载均衡器问题排查

此服务包含在连续多次尝试之后仍无法启动的任务。此时,服务计划程序开始逐渐增加重试间隔的时间。您应该排查任务无法启动的原因。有关更多信息,请参阅服务限制逻辑

服务更新后,例如,通过更新的任务定义更新后,服务计划程序恢复正常行为。

由于 API 限制,此服务无法启动更多任务。一旦服务调度器能够启动更多任务,它将恢复。

要请求 API 速率限制配额增加,请打开 AWS Support 中心页面,必要时登录,然后选择创建案例。选择 Service Limit increase (提高服务限制)。填写并提交表格。

由于部署配置,此服务无法在服务部署期间停止或启动任务。部署配置由 minimumHealthyPercentmaximumPercent 值组成,这些值是在创建服务时定义的,但也可以在现有服务上更新。

minimumHealthyPercent 表示在部署期间或容器实例耗尽时应为服务运行的任务数的下限,服务所需任务数的百分比表示。此值四舍五入。例如,如果最小运行状况百分比为 50,并且所需的任务计数为 4,则调度器可以在启动两个新任务之前停止两个现有任务。同样,如果最小运行状况百分比为 75%,所需任务计数为 2,则由于结果值也为 2,调度器无法停止任何任务。

maximumPercent 表示部署期间或容器实例耗尽时应为服务运行的任务数的上限,服务所需任务数的百分比表示。此值四舍五入。例如,如果最大百分比为 200 且目标任务为计数四,则调度器可以在停止四个现有任务之前启动四个新任务。同样,如果最大百分比为 125,且目标任务计数为三,则调度器无法启动任何任务,因为结果值也是三。

设置最小运行状况百分比或最大百分比时,应确保调度器在触发部署时可以停止或启动至少一个任务。

您可以请求增加导致错误的资源的配额。有关更多信息,请参阅Amazon ECS 服务配额。要请求提高配额,请参阅 Service Quotas 用户指南中的请求增加配额

由于子网位于不受支持的可用区中,该服务无法启动任务。

有关支持的 Fargate 区域和可用区的信息,请参阅 Amazon ECS 在 AWS Fargate 上的支持区域

有关如何查看子网可用区的信息,请参阅 Amazon VPC 用户指南中的查看您的子网

您可以请求增加导致错误的资源的配额。有关更多信息,请参阅Amazon ECS 服务配额。要请求提高配额,请参阅 Service Quotas 用户指南中的请求增加配额

您可以请求增加导致错误的资源的配额。有关更多信息,请参阅Amazon ECS 服务配额。要请求提高配额,请参阅 Service Quotas 用户指南中的请求增加配额

AWS Fargate 正在从基于任务计数的限额过渡到基于 vCPU 的限额。

您可以请求对基于 Fargate vCPU 的限额增加限额。有关更多信息,请参阅Amazon ECS 服务配额。要请求提高 Fargate 限额,请参阅《Service Quotas 用户指南》中的请求增加限额

服务的受保护任务数量超过了所需的任务数量。您可以执行以下操作之一:

  • 等到当前任务的保护到期,使它们能够被终止。

  • 确定哪些任务可以停止。然后,使用 UpdateTaskProtection API 和 protectionEnabled 选项将 false 设置为取消对这些任务的保护。

  • 增加服务的所需任务计数,以大于受保护任务的数量。