我的 Amazon Elastic Container Service (Amazon ECS) 服务会定期自行重启。我希望我的 Amazon ECS 服务保持稳定状态。
简短描述
您的 Amazon ECS 服务可能由于以下原因之一而无法保持稳定状态:
- 容器运行状况检查失败。
- 弹性负载均衡 (ELB) 运行状况检查失败。
- Amazon ECS 任务以非零退出代码退出。
- 容器实例不满足 Amazon ECS 任务要求。
- 容器实例意外终止。
- 服务中的 Amazon ECS 任务无法启动。
解决方法
在 Amazon ECS 控制台上使用 Amazon ECS 事件来检查服务不稳定的原因。
容器运行状况检查失败
在将应用程序部署到 Amazon ECS 之前,请通过运行状况检查来确保您的容器能够按预期运行。如果您的 Amazon ECS 服务的容器运行状况检查突然失败,请查看应用程序日志。如果您的应用程序使用 awslogs 驱动程序,请在 Amazon CloudWatch 中查看相关日志。
**注意:**您在容器定义中指定的运行状况检查参数会覆盖容器映像中存在的 Docker 运行状况检查。
ELB 运行状况检查失败
负载均衡器会定期在每台服务器上运行容器运行状况检查,以确定可以安全将流量导向哪些服务器。当 Amazon ECS 服务因 ELB 运行状况检查而失败时,负载均衡器与该服务之间可能存在通信问题。
要检查您是否正确配置了负载均衡器和 Amazon ECS 服务,请执行以下操作:
-
确认容器安全组是否允许来自负载均衡器的流量。
-
在容器内运行以下命令,以确保应用程序侦听正确的端口:
netstat -tulpn | grep LISTEN
-
确保运行状况检查路径正确。
-
检查应用程序日志中是否存在错误。
-
在 Amazon Elastic Compute Cloud (Amazon EC2) 内针对运行状况检查路径运行 curl 命令。或者,在 AWS Fargate 上激活 ECS exec,然后在容器内针对运行状况检查运行 curl 命令,以确认响应代码。
-
监控服务的 CPU 和内存指标,因为高 CPU 利用率可能会导致应用程序无响应,并导致 ELB 运行状况检查失败。
-
将最小运行状况检查宽限期设置为应用程序达到 ACTIVE 状态所需时间的 1.5-2.0 倍。
Amazon ECS 任务以非零退出代码退出
如果容器中出现问题,服务内的 Amazon ECS 任务将以非零退出代码退出。所有任务必须至少有一个基本容器。如果基本容器因任何原因而退出,则整个任务将失败,且 Amazon ECS 服务会变得不稳定。
以下退出代码是导致您的 Amazon ECS 任务失败的可能原因:
- 当出现应用程序错误时,您将收到退出代码 1。有关错误的详细信息,请查看应用程序日志。
- 当容器任务被强制退出 (SIGKILL) 或出现内存不足 (OOM) 错误时,您将收到退出代码 137。要检查是否遇到了 OOM 问题,请查看您的 CloudWatch 指标。
- 当出现分段错误时,您将收到退出代码 139。这种情况通常会在应用程序尝试访问不可用的内存时发生,或者在未设置环境变量或环境变量无效时发生。
- 当容器中的 ENTRYPOINT CMD 命令由于错误而失败时,您将收到退出代码 255。要确认是否因为此原因,请查看您的 CloudWatch 指标。
**注意:**您可以使用 DescribeTasks API 来查看已停止任务的详细信息。但是,已停止任务的详细信息仅会在结果中显示 1 小时。
容器实例不满足 Amazon ECS 任务要求
有关如何解决容器要求相关问题的详细信息,请参阅如何解决 Amazon ECS 中的“no container instance met all of its requirements”(没有容器实例满足其所有要求)错误?
容器实例意外终止
如果您在未启用托管终止的情况下在 Amazon ECS 集群中使用容量提供商,则容量提供商可能会终止正在运行任务的实例。当发生缩容操作,导致 AWS ECS 服务变得不稳定时,会出现这种情况。激活托管终止保护,以便容量提供商不会终止正在运行任务的容器实例。
要激活托管终止保护,必须为自动扩缩组开启实例缩容保护。
要开启缩容保护,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中,选择 Auto Scaling Groups(自动扩缩组),然后选择您的自动扩缩组。
- 在 Details(详细信息)选项卡的 Advanced configurations(高级配置)下,选择 Edit(编辑)。
- 在 Instance scale-in protection(实例缩容保护)下,选择 Enable instance scale-in protection(启用实例缩容保护)。
- 选择 Update(更新)。
要激活托管终止保护,请完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群)。
- 在 Clusters(集群)页面上,选择您的集群。
- 在 Cluster : name(集群:名称)页面上,选择 Infrastructure(基础设施),然后选择 Update(更新)。
- 在 Create capacity providers(创建容量提供商)页面上,在 Auto Scaling group(自动扩缩组)下的 Scaling policies(扩展策略)下,配置以下选项:
选择 Turn on managed scaling(开启托管扩展)。
选择 Turn on scaling protection(开启扩展保护)。
- 选择 Update(更新)。
**注意:**确保您使用的其他工具不会从自动扩缩组中移除 AmazonECSManaged 标签。如果工具移除标签,Amazon ECS 将无法管理扩展。
服务内的 Amazon ECS 任务无法启动
当创建或更新服务时,由于 Amazon ECS 任务无法拉取映像,该服务可能会不稳定。
要解决此问题,请参阅以下 AWS Knowledge Service 文章:
相关信息
如何对 Amazon ECS 任务的容器运行状况检查失败问题进行故障排除?
如何解决 Amazon ECS 中容量提供商的托管终止保护设置错误?
为什么我的 Amazon ECS 任务停止了?
控制 Amazon ECS 终止的实例
AWS service event metadata