如何对 Fargate 上 Amazon ECS 任务的应用程序负载均衡器运行状况检查失败进行故障排除?

2 分钟阅读
0

我想解决在 AWS Fargate 上运行 Amazon Elastic Container Service(Amazon ECS)任务时的应用程序负载均衡器运行状况检查失败问题。

简短描述

当 Amazon ECS 任务未通过应用程序负载均衡器运行状况检查时,您可能会从 Amazon ECS 服务事件消息中收到以下错误之一:

  • 请求超时
  • 运行状况检查失败,无错误代码
  • 运行状况检查失败,错误代码为 404 或 5xx
  • 目标位于没有为负载均衡器启用的可用区

有关容器运行状况检查失败的问题,请参阅如何解决 Amazon ECS 任务的容器运行状况检查失败问题?

如果您在将 Amazon ECS 与 Amazon Elastic Compute Cloud (Amazon EC2) 容器实例一起使用,请参阅以下文档:

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确认您运行的是最新版本的 AWS CLI。在以下 AWS CLI 命令中,请将示例值替换为您的值。

请求超时错误

检查安全组,确保负载均衡器可以向 Fargate 任务发出运行状况检查请求。Fargate 任务安全组必须允许任务定义中指定的容器端口上的入站和出站流量。来源必须是应用程序负载均衡器安全组。应用程序负载均衡器安全组必须允许流向 Fargate 任务安全组的出站流量。

**注意:**最佳做法是为您的 Fargate 任务和负载均衡器配置不同的安全组,以允许它们之间的流量。

如果安全组允许您的 Fargate 任务和应用程序负载均衡器之间进行通信,请检查运行状况检查设置中的 HealthCheckTimeoutSeconds。如有必要,请略微增加一点超时秒数。

**注意:**仅当您的应用程序对运行状况检查的响应时间很长时,才应增加 HealthCheckTimeoutSeconds

要检查平均响应时间,请运行以下命令:

$ time curl -Iv http://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>

**注意:**任务的资源利用率过高可能会导致进程变慢或挂起,并导致运行状况检查失败。

运行状况检查失败,无错误代码

运行状况检查失败错误消息示例:

(service AWS-service) (port 80) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)

如果您收到类似的错误消息,请检查任务在 Amazon ECS 中启动后是否会快速响应。此外,请检查应用程序回复的响应代码是否正确。

确保任务在 Amazon ECS 中启动后有时间做出响应

要确保任务在启动后有足够的时间做出响应,请增加 healthCheckGracePeriodSeconds。这样就允许 Amazon ECS 将任务保留更长时间,并忽略运行不正常的弹性负载均衡目标运行状况检查。

**注意:**如果您在创建新服务,则可以在负载均衡器配置页面上配置运行状况检查宽限期。

要更新现有 Amazon ECS 服务的 healthCheckGracePeriodSeconds,请运行以下命令:

$ aws ecs update-service --cluster <EXAMPLE-CLUSTER-NAME> --service <EXAMPLE-SERVICE-NAME> --region <EXAMPLE-REGION> --health-check-grace-period-seconds <example-value-in-seconds>

检查应用程序回复的响应代码是否正确

要确认您的应用程序在运行状况检查路径上发送的响应代码,请使用以下方法。

如果您在应用程序上配置了访问日志记录,请使用 ELB-HealthChecker/2.0 检查响应。如果您使用的是 AWS CloudWatch 日志,请使用 Amazon CloudWatch Logs Insights 并运行以下命令:

fields @timestamp, @message
  | sort @timestamp desc
  | filter @message like /ELB-HealthChecker/

对于同一 Amazon Virtual Private Cloud(Amazon VPC)中的 Amazon EC2 实例,请运行以下命令,以确认您的任务对手动检查做出响应。要启动新的 Amazon EC2 实例,请参阅教程: 开始使用 Amazon EC2 Linux 实例

HTTP 运行状况检查

$ curl -Iv http://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>

HTTPS 运行状况检查

$ curl -Iv https://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>

如果任务快速停止,您无法获得私有 IP 地址,请在 Amazon ECS 之外启动一个独立的任务解决问题。使用相同的任务定义并对其 IP 地址运行 curl 命令以启动任务。任务不会因为运行状况检查失败而停止。

此外,使用 Amazon ECS Exec 在容器级别上检查侦听端口。使用 netstat 确认应用程序在侦听相应的端口:

$ netstat -tulpn | grep LISTEN

运行状况检查失败,错误代码为 404 或 5xx

如果收到含有 4045xx 错误代码的运行状况检查失败消息,则表明运行状况检查请求已得到确认,但收到的响应代码无效。这些代码还表明,应用程序发送的响应代码与目标组级别上配置的成功代码不匹配(参数:Matcher)。

当运行状况检查路径不存在或运行状况检查路径的配置中存在拼写错误时,可能会出现 404 错误代码。当任务中的应用程序未正确回复请求或存在处理错误时,可能会出现 5xx 错误代码。

要确定您的应用程序是否成功启动,请检查您的应用程序日志

目标位于没有为负载均衡器启用的可用区

为负载均衡器启用可用区后,弹性负载均衡会在可用区中创建一个负载均衡器节点。如果您在可用区中注册了目标但未启用可用区,则注册的目标不会接收流量。有关详细信息,请参阅可用区和负载均衡器节点

要确定为您的负载均衡器配置的可用区,请运行以下命令:

aws elbv2 describe-load-balancers --load-balancer-arns <EXAMPLE-ALB-ARN> --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'

要确定为您的 Fargate 任务配置的可用区,请运行以下命令:

aws ecs describe-services --cluster <EXAMPLE-CLUSTER-NAME> --service <EXAMPLE-SERVICE-NAME> --query 'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'

**注意:**使用 update-service AWS CLI 命令更改 Amazon ECS 服务的子网配置。使用 enable-availability-zones-for-load-balancer AWS CLI 命令将可用区添加到现有的应用程序负载均衡器。

相关信息

服务负载均衡器故障排除

目标组的运行状况检查

AWS 官方
AWS 官方已更新 1 年前