跳至内容

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

3 分钟阅读
0

当我在 AWS Fargate 上运行 Amazon Elastic Container Service (Amazon ECS) 任务时,我收到网络负载均衡器运行状况检查失败错误。

简短描述

有关 HTTP 和 HTTPS 运行状况检查,请参阅如何对 Fargate 上 Amazon ECS 任务的应用程序负载均衡器运行状况检查失败进行故障排除?

当您的 Amazon ECS 任务未通过网络负载均衡器运行状况检查时,您会在服务事件消息中收到类似于以下示例的错误:

  • “运行状况检查失败”错误 -(服务 AWS-service)(端口 80)在 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中运行状况不佳,原因是(原因:运行状况检查失败)”
  • “目标位于负载均衡器未启用的可用区”错误 -(服务 AWS-service)(端口 80)在 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中运行状况不佳,原因是(原因:目标位于负载均衡器未启用的可用区)”
  • “Health checks requests getting timed out - (service AWS-service) (port 8443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Request timed out).”

如果您收到容器运行状况检查失败,请参阅如何对 Amazon ECS 任务的容器运行状况检查失败进行故障排除?

如果您的 Amazon ECS 任务已停止,请参阅查看 Amazon ECS 已停止任务错误

解决方法

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

运行状况检查失败

要对 Fargate 任务的负载均衡器运行状况检查失败进行故障排除,请执行以下操作。

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

要允许负载均衡器对 Amazon ECS 任务执行运行状况检查,请确认以下配置:

  • 如果您的容器映射到端口 80,则您的任务安全组必须允许入站流量通过端口 80。
  • 应用程序可以在映射到任务定义中的容器实例的端口上运行。
  • 弹性网络接口安全组允许 Amazon Virtual Private Cloud (Amazon VPC) CIDR 范围内的流量。有关详细信息,请参阅目标安全组
  • 网络负载均衡器安全组规则允许出站流量通过所需容器端口流向 Amazon ECS 服务安全组。
  • 任务的网络接口子网的网络访问控制列表(网络 ACL)允许入站流量通过运行状况检查端口。
  • 网络 ACL 允许出站流量通过临时端口。

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

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

**注意:**您可以为 Amazon EC2 启动类型创建集群,也可以启动新的 Amazon EC2 实例。如果您不想启动 Amazon EC2 实例,则可以使用 ECS Exec

要检查您的任务响应,请使用 SSH 连接到 Amazon VPC 连接中的 EC2 实例。然后,运行以下命令之一来测试您的目标组配置。

HTTP 运行状况检查:

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

**注意:**请将 example-task-private-ip 替换为您的任务 IP 地址,将 example-port 替换为您的端口。对于目标组上的 HTTP 运行状况检查配置,命令输出中将显示 200-399 范围内的成功状态代码。

示例输出:

HTTP/1.1 200 OK

不对目标使用 SSL 的 TCP 运行状况检查:

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

**注意:**请将 example-task-private-ip 替换为您的任务 IP 地址,将 example-port 替换为您的端口。

示例输出:

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

需要 SSL 进行后端运行状况检查的 TCP 运行状况检查:

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

**注意:**请将 example-task-private-ip 替换为您的任务 IP 地址,将 example-port 替换为您的端口。

示例输出:

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

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

请执行以下操作:

  • 检查是否为目标组正确配置了 ping 端口和运行状况检查路径。
  • 监控服务的 CPU 和内存使用率指标,以了解是否存在导致应用程序无法响应运行状况检查请求的高资源消耗。

如果任务需要更长的运行状况检查宽限期,请运行以下 AWS CLI 命令 update-service,以增加 healthCheckGracePeriodSeconds

aws ecs update-service --cluster example-cluster --service example-service --region example-region --health-check-grace-period-seconds example-value --force-new-deployment

**注意:**请将 example-cluster 替换为您的集群名称,将 example-service 替换为您的服务名称,将 example-region 替换为您的 AWS 区域,将 example-value 替换为您的运行状况检查宽限期(以秒为单位)。

检查目标组中的目标是否因为响应时间超过默认超时时间而未通过运行状况检查。要解决此问题,请运行以下 modify-target-group 命令以增加目标组的超时秒数:

aws elbv2 modify-target-group --target-group-arn Target-Group-ARN --health-check-timeout-seconds Timeout-Value

**注意:**请将 Target-Group-ARN 替换为目标组 ARN,将 Timeout-Value 替换为您的组超时值(以秒为单位)。

检查应用程序日志中是否有应用程序错误

确保您的应用程序在 HealthCheckPath 上发送的响应代码与目标组的运行状况检查参数中的响应代码相匹配。如果您在应用程序上配置了访问日志记录,请使用 ELB-HealthChecker/2.0 关键字检查记录的响应。如果您使用的是 Amazon CloudWatch Logs,请使用 CloudWatch Logs Insights 运行以下查询:

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

查询的输出中将显示网络负载均衡器发送的运行状况检查请求、响应代码以及错误。

目标位于负载均衡器未激活的可用区

如果您在可用区中注册目标,则必须激活该可用区,注册的目标才能接收流量。

**重要事项:**创建负载均衡器后,将无法停用网络负载均衡器的可用区。但是,您可以激活其他可用区。

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

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

**注意:**请将 example-arn-load-balancer 替换为您的负载均衡器 ARN,将 example-region 替换为您的区域。

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

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

**注意:**请将 example-cluster-name 替换为您的集群名称,将 example-service-name 替换为您的服务名称,将 example-region 替换为您的区域。命令输出中将显示您的服务中子网的 ID。

要确定任务子网的可用区,请运行以下 describe-subnets 命令:

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

**注意:**请将 example-subnet-ids 替换为您的子网 ID,将 example-region 替换为您的区域。命令输出中将显示为您的服务配置的可用区。

要更改 Amazon ECS 服务的子网配置,请运行以下 update-service 命令:

aws ecs update-service --cluster cluster-name --service service-name --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxx,subnet-yyyyy]}"

**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称。

后端依赖项

如果应用程序的运行状况检查路径与上游或下游服务(例如数据库)通信,请确保服务可用。服务相关问题可能会导致运行状况检查失败。

由于多种原因,Amazon ECS 任务可能会处于 Unhealthy(运行状况不佳)状态。如果上述解决方法无法解决您的问题,请参阅对 Amazon ECS 中的服务负载均衡器进行故障排除

相关信息

网络负载均衡器目标组的运行状况检查

网络配置

AWS 官方已更新 4 个月前