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

3 分钟阅读
0

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

简短描述

配置运行状况检查后,您的网络负载均衡器会定期向每个注册目标发送运行状况检查请求。对于 TCP 运行状况检查,运行状况检查只是尝试在指定端口上打开 TCP 连接。在配置的超时内无法在指定端口上打开连接被视为不正常。对于 UDP 服务,使用目标组的非 UDP 运行状况检查来测试目标可用性。有关 HTTP 和 HTTPS 运行状况检查,请参阅如何对 Fargate 上 Amazon ECS 任务的应用程序负载均衡器运行状况检查失败进行故障排除?

当您的 Amazon ECS 任务未通过网络负载均衡器运行状况检查时,您的 Amazon ECS 服务事件消息中可能会出现以下错误:

  • “运行状况检查失败”错误 - (目标组 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)中的(服务 AWS-Service)(端口 80)运行不正常,原因是(原因“运行状况检查失败”)
  • “目标位于没有为负载均衡器启用的可用区”错误 - (目标组 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)中的(服务 AWS-Service)(端口 80)运行不正常,原因是(原因是“目标位于没有为负载均衡器启用的可用区”)

来自您的 Amazon ECS 任务控制台的错误消息示例:

(目标组 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)中任务未通过 ELB 运行状况检查

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

如果您的 Amazon ECS 任务已停止,请参阅检查已停止的任务是否有错误

**注意:**由于多种原因,Amazon ECS 任务可能会返回不正常状态。如果以下解决方法无法解决您的错误,请参阅服务负载均衡器故障排除

解决方法

**重要事项:**请查看所有 AWS 命令行界面(AWS CLI)命令,并将所有 example 字符串实例替换为您的值。例如,将 example-task-private-ip 替换为您的特定任务的私有 IP 地址。

注意:如果在运行 AWS CLI 命令时收到错误,请确认您运行的是最新版本的 AWS CLI

运行状况检查失败

如需解决 Amazon ECS Fargate 任务的负载均衡器运行状况检查失败问题,请完成以下步骤:

  • 检查您的负载均衡器与 Amazon ECS 任务之间的连接
  • 确认您的任务能正确响应您的 Amazon Virtual Private Cloud(Amazon VPC)中的手动检查
  • 检查您的 Amazon ECS 容器中应用程序的状态和配置

检查负载均衡器与 Amazon ECS 任务之间的连接

确保允许负载均衡器对您的 Amazon ECS 任务执行运行状况检查:

  • 如果容器已映射到端口 80,请确认容器安全组允许端口 80 上的入站流量。
  • 确保 Amazon ECS Fargate ENI 安全组允许 Amazon VPC CIDR 范围内的流量。这允许网络负载均衡器节点访问 Amazon ECS 任务来执行运行状况检查。有关详细信息,请参阅目标安全组
  • 确认与您的 Fargate 任务的弹性网络接口子网关联的网络访问控制列表(ACL)允许入站流量。必须允许运行状况检查端口上的入口流量。此外,请确认网络 ACL 允许临时端口上的出口流量。

确认您的任务正确响应 Amazon VPC 中的手动检查

确认 Amazon VPC 中的 Amazon Elastic Compute Cloud(Amazon EC2)实例任务正确响应手动检查:

**注意:**您可以为 Amazon EC2 启动类型创建集群,也可以启动新的 Amazon EC2 实例。如果不想启动 Amazon EC2 实例,则可以使用 ECS exec 功能。为此,请使用 --enable-execute-command 在同一 VPC 中启动独立任务。

**(选项 1)**对于 HTTP 运行状况检查:

$ curl -Iv http://<example-task-private-ip>:<example-port>/<healthcheck_path>

输出示例:

HTTP/1.1 200 OK

**注意:**对于为目标组上的 HTTP 运行状况检查设置的配置,您可以收到 200-399 范围内的成功状态码。

**(选项 2)**对于不对目标使用 SSL 的 TCP 运行状况检查:

$ nc -z -v -w10 example-task-private-ip example-port

输出示例:

nc -z -v -w10 10.x.x.x 80
Connection to 10.x.x.x port 80 [tcp/http] succeeded!

**(选项 3)**对于需要 SSL 进行后端运行状况检查的 TCP 运行状况检查:

$ nc -z -v -w10 --ssl example-task-private-ip example-port

输出示例:

nc -z -v -w10 10.x.x.x 443
Connection to 10.x.x.x port 443 [tcp/https] succeeded!

检查 ECS 容器中应用程序的状态和配置

  • 检查目标组的 ping 端口和运行状况检查路径配置是否正确。
  • 监控您的 Amazon ECS 服务的 CPU 和内存利用率指标
  • 如果您的 Amazon ECS 任务需要更长的运行状况检查宽限期才能注册到网络负载均衡器,请增加 healthCheckGracePeriodSeconds。如需更新运行状况检查宽限期,请运行以下命令:
$ aws ecs update-service --cluster example-cluster --service example-service --region <example-region> --health-check-grace-period-seconds <example-value-in-seconds>
  • 检查您的应用程序日志中是否有应用程序错误。有关详细信息,请参阅在 CloudWatch Logs 中查看 awslogs 容器日志
  • 确认您的应用程序在 HealthCheckPath 上发送的响应代码。如果您的应用程序配置了访问日志,则使用 ELB-HealthChecker/2.0 关键字检查记录的响应。如果使用的是 CloudWatch Logs,请使用 Log Insights 并运行以下查询:
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /ELB-HealthChecker/

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

当您为负载均衡器启用可用区(AZ)时,负载均衡会在 AZ 中创建一个负载均衡器节点。如果您在可用区中注册目标,则需要启用可用区,以便注册的目标接收流量。有关详细信息,请参阅可用区和负载均衡器节点

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

$ aws elbv2 describe-load-balancers --load-balancer-arn <example-arn-load-balancer> --region <example-region> --query "LoadBalancers[].AvailabilityZones[].ZoneName"

**注意:**创建网络负载均衡器后,您无法关闭其可用区,但可以启用其他可用区。

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

**注意:**以下命令会返回为您的服务配置的子网。

$ aws ecs describe-services —cluster <example-cluster-name> —services <example-service-name> --region <example-region> --query "services[].networkConfiguration.awsvpcConfiguration.subnets"

如需识别上述子网的可用区,请在以下命令中使用前面的子网 ID:

**注意:**以下命令会返回为您的服务配置的可用区。

$ aws ec2 describe-subnets --subnet-ids <example-subnet-ids> --region <example-region> --query "Subnets[].AvailabilityZone"

**注意:**您可以使用 AWS CLI update-service 命令更改 Amazon ECS 服务的子网配置

相关信息

服务负载均衡器故障排除

目标组的运行状况检查

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