跳至内容

如何在部署期间为 Amazon ECS 任务设置正常关闭和连接耗尽?

1 分钟阅读
0

当我在 Amazon Elastic Container Service (Amazon ECS) 集群中部署新服务时,任务被错误部署或终止。

解决方法

确保您使用的容器具有足够的资源容量

如果新部署始终无法通过负载均衡器运行状况检查,请检查 Amazon ECS Container Insights 指标 CpuUtilizedCpuReservedMemoryUtilized。如果您使用应用程序负载均衡器,也请检查 TargetResponseTime

此外,请将 HealthCheckGracePeriodSeconds 属性的值配置为大于应用程序的启动时间。运行状况检查响应延迟可能会导致失败,并导致 Amazon ECS 循环执行任务。

检查容器状态和退出代码

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI

对于意外终止的任务,请运行以下 describe-tasks 命令来检查容器退出代码:

aws ecs describe-tasks  --cluster ECS_CLUSTER  --tasks TASK_ARN -- region REGION

**注意:**请将 ECS_CLUSTER 替换为您的集群名称,将 TASK_ARN 替换为任务 ARN,将 REGION 替换为您的 AWS 区域。

如果上述命令的输出为 0,则表示任务已成功启动。如果输出为 1,则表示存在应用程序错误,您必须检查应用程序日志。如果输出为 137,则表示容器收到了 SIGKILL 信号,这通常是由内存不足问题引起的。要解决此问题,请参阅如何解决 Amazon ECS 中的 OutOfMemory 错误?以及为什么我的 Amazon ECS 任务停止了?

查看任务定义配置

确保所有任务定义配置均有效,尤其是在修改或创建新的任务定义之后。要验证您的任务定义配置,请运行独立任务

配置负载均衡器设置

根据您的需求,在负载均衡器中配置 deregistration_delay.timeout_seconds。对于长期存在的请求,请使用更高的值。对于 Amazon Elastic Compute Cloud (Amazon EC2) 竞价型实例,该值必须低于 120 秒。

要修改 deregistration_delay.timeout_seconds,请运行以下 modify-target-group-attributes 命令:

aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120

**注意:**请将 EXAMPLE_ARN 替换为您的负载均衡器 ARN,将 120 替换为注销延迟超时(以秒为单位)。

此外,请优化负载均衡器的运行状况检查设置。如果设置对于应用程序太过严格,负载均衡器可能会经常将目标标记为运行状况不佳。

配置应用程序的正常关闭时间

默认情况下,ECS_CONTAINER_STOP_TIMEOUT 设置为 30 秒。当您在新 Amazon ECS 部署中的先前任务的耗尽阶段访问应用程序时,您可能会收到 5xx 错误。如果您在访问应用程序时遇到问题,请根据应用程序的正常关闭需求增加 ECS_CONTAINER_STOP_TIMEOUT 的值。最佳做法是在部署更新后的值之前在测试环境中对其进行测试。

要更新该值,请在任务定义中添加与以下示例类似的代码:

{
  "containerDefinitions": [
    {
      "name": "your-container",
      "image": "your-image",
      "stopTimeout": 120
    }
  ]
}

**注意:**请将 120 替换为您的 ECS_CONTAINER_STOP_TIMEOUT 值。

配置正常关闭,请在您的应用程序中添加 SIGTERM 处理程序。对于 AWS Fargate Spot,请设置配置以在 SIGTERM 处理程序操作期间调用 DeregisterTargets。这可确保 Amazon ECS 从负载均衡器的目标组中注销 FARGATE_SPOT 任务。

相关信息

优化 Amazon ECS 的负载均衡器连接耗尽参数

AWS 官方已更新 1 年前