我该如何使用 Amazon EC2 启动类型运行 Amazon ECS 任务,以便通过 Amazon ECS 中的 Application Load Balancer 运行状况检查?

最后更新日期:2022 年 3 月 17 日

在 Amazon Elastic Container Service (Amazon ECS) 中对一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例进行 Application Load Balancer 运行状况检查时,返回了一个运行状况不佳的状态。我想让我的 EC2 实例通过运行状况检查。

简短描述

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

  • 在(目标组 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)中 (service AWS-service)(8080 端口)运状状况不佳,原因是(运行状况检查失败,代码为:【502或504】)或(请求超时)
  • 在目标组 tf-20190411170 中 (service AWS-Service)(8080 端口)运行状况不佳, 原因是(运行状况检查失败)
  • 在 (目标组 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)中 (service AWS-Service) (实列 i-1234567890abcdefg)(端口 443) 运行状况不佳,其原因是(运行状况检查失败)

您可能还会从 Amazon ECS 任务控制台收到以下错误消息:

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

如果你收到错误信息(service AWS-Service)(任务 c13b4cb40f1f4fe4a2971f76ae5a47ad)容器运行状况检查失败,请参阅如何对 Amazon ECS 任务的容器运行状况检查失败进行故障排除?

注意:Amazon ECS 任务返回运行状态不佳的原因可能有很多。如以下步骤未能解决您的问题,请参阅对服务负载均衡器进行故障排除

提示: 要了解您的 ECS 任务停止的原因,请参阅检查已停止的任务是否存在错误

解决方案

要对 Amazon ECS 任务中负载均衡器运行状况检查方面的问题进行故障排除并通过 Application Load Balancer 运行状况检查,请检查以下内容:

  • 您的负载均衡器与 Amazon ECS 任务之间的连通性
  • 目标组的运行状况检查设置
  • 您的 ECS 容器中应用程序的状态和配置情况
  • 容器实例的状态

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

要确保允许您的负载均衡器对您的 Amazon ECS 任务执行运行状况检查,请务必执行以下操作。

挂载到负载均衡器和容器实例或 awsvpc 网络模式的 ECS 任务弹性网络接口的安全组配置正确

最佳实践是为您的负载均衡器和容器实例或任务弹性网络接口配置不同的安全组。通过这种方法,您可以允许负载均衡器与容器实例或任务弹性网络接口之间的所有流量。您还需要允许容器实例接受为此任务指定的端口流量。

  • 确认与负载均衡器关联的安全组允许将流量输出到初级端口上的容器实例或任务弹性网络接口。确认与您的容器实例相关联的运行状况检查端口也是如此(如果适用)。
  • 确认与您的容器实例相关联的安全组或任务弹性网络接口允许任务主机端口上的所有入口流量,来自与您的负载均衡器相关联的安全组。要检查与您的负载均衡器相关联的安全组,请参阅 Application Load Balancer 的安全组

重要提示:如果您使用的是动态端口映射,则此服务将通过动态端口(通常为端口 32768-65535)公开,而非通过主机端口公开。在这种情况下,请确认您的容器实例安全组在针对作为来源的负载均衡器的入口规则中反映了临时端口范围。

您的负载均衡器配置在相同的可用区中,以作为您的容器实例或 awsvpc 网络模式的 ECS 任务弹性网络接口

当您为负载均衡器启用可用区时,Elastic Load Balancing 会在可用区中创建一个负载均衡器节点。如果您在可用区中注册目标,但未启用可用区,则这些初级目标不会接收流量。有关更多信息,请参阅可用区和负载均衡器节点

要获取配置您的负载均衡器的可用区,请执行以下操作:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中,选择 负载均衡 下的 负载均衡器
  3. 选择您正在为 Amazon ECS 服务所使用的负载均衡器。
  4. 描述选项卡上,您可以在可用区字段下查看可用区。

注意:对于 Application Load Balancer,您可以随时启用或禁用可用区。对于 Network Load Balancer,您启用后无法禁用该可用区,但您可以启用其他可用区。

如果您正在使用 Application Load Balancers,则跨区域负载均衡将始终处于打开状态。如果您正在使用 Network Load Balancers,则默认情况下会关闭跨区域负载均衡。创建 Network Load Balancer 后,您可以随时打开或关闭跨区域负载均衡。有关更多信息,请参阅弹性负载均衡如何起作用

要获取配置容器实例的可用区,请执行以下操作:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的弹性伸缩 下,选择 Auto Scaling 组(Auto Scaling 组)。
  3. 选择与您的集群相关联的容器实例 Auto Scaling 组。
  4. 详细信息选项卡上,根据 网络,确认列出的可用区与为您的负载均衡器列出的可用区是否匹配。

要修改集群的可用区,请打开 AWS CloudFormation 控制台,为您的集群选择 CloudFormation 堆栈,然后更新子网配置。

要查找针对 awsvpc 的任务弹性网络接口所配置的可用区,请执行以下操作:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中选择集群,然后选择包含您服务的集群。
  3. 在集群页面的服务选项卡上,在服务名称列中选择您想要检查的服务。
  4. 选择详细信息,然后选择允许的子网以查看为该服务启用的子网。
  5. 您可以在 Amazon VPC 控制台中查看子网。
  6. 验证子网的可用区是否与为负载均衡器列出的可用区相匹配。

注意:您无法从 Amazon ECS 控制台更改 Amazon ECS 服务的子网配置。您可以通过使用 AWS Command Line Interface (AWS CLI) 更新服务命令来执行此操作。

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

与负载均衡器和 ECS 容器实例或 awsvpc 网络模式中 ECS 任务弹性网络接口的子网相关联的网络访问控制列表 (ACL) 配置都正确

负载均衡器的子网与容器实例或任务弹性网络接口的子网可能会有所不同。要确保这些子网之间的流量得到允许,请检查以下内容:

  • 验证与您的负载均衡器节点子网相关联的网络 ACL 是否允许临时端口(1024 - 65535)和监听端口上的入口流量。验证网络 ACL 是否也允许运行状况检查和临时端口上的出口流量。
  • 请确保与您的容器实例或 awsvpc 模式任务弹性网络接口的子网相关联的网络 ACL 允许运行状况检查端口上的入口流量。验证网络 ACL 是否允许临时端口上的出口流量。

有关网络 ACL 的更多信息,请参阅使用网络 ACL

检查您目标组的运行状况检查设置

要确保您的目标组运行状况检查设置都配置正确,请执行以下操作:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中,选择负载均衡下的T目标组。
  3. 选择您的目标组。
    重要提示:使用一个新的目标组。不要手动向目标组中添加目标,因为 Amazon ECS 会自动向目标组注册和注销容器。
  4. 运行状况检查选项卡上,执行以下操作:
    检查端口路径字段的配置是否正确。如果端口字段配置不正确,则您的负载均衡器可能会注销该容器。
    请确保您为该端口选择了流量端口
    注意:如果您选择覆盖,则请确认所指定的端口匹配任务主机端口。
    请确保为超时正确设置了响应超时值。
    注意:响应超时是您的容器必须对运行状况检查进行 ping 而返回一个响应的时间量。如果这个值低于响应所需的时间量,则运行状况检查会失败。

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

请确认您的 ECS 容器中的应用程序响应了负载均衡器运行状况检查

要确保您的 ECS 容器中的应用程序正确响应了负载均衡器运行状况检查,请执行以下操作:

  • 检查目标组的 ping 端口和运行状况检查路径配置是否正确。
  • 监测 ECS 服务的 CPU 和内存使用指标。例如,CPU 较高可能会使应用程序无响应并导致 502 错误或超时。
  • 定义最小运行状况检查宽限期。这样,服务调度器就会在任务实例化后,在预先定义的时间段内忽略 Elastic Load Balancing 运行状况检查。您的 Amazon ECS 任务可能需要更长的运行状况检查宽限期,以便注册Network Load Balancer。
  • 针对应用程序错误,请检查应用程序日志。有关更多信息,请参阅查看 CloudWatch 日志中的 awslogs 容器日志

请确认您的 Amazon ECS 容器中的应用程序返回了正确的响应代码

当负载均衡器向运行状况检查路径发送 HTTP GET 请求时,Amazon ECS 容器中的应用程序应返回默认的 200 OK 响应代码。

注意:如果您使用 Application Load Balancer,可将 Matcher 的设置更新为除 200 以外的其他响应代码。有关更多信息,请参阅目标组的运行状况检查

1.    使用 SSH 连接到您的容器实例

2.    (可选)使用适合您系统的命令安装 curl。

对于 Amazon Linux 及其他基于 RPM 的发行版,请运行以下命令:

sudo yum –y install curl

对于基于 Debian 的系统(例如 Ubuntu),请运行以下命令:

sudo apt-get install curl

3.    要获取容器 ID,请运行以下命令:

docker ps

注意:本地侦听器端口显示在序列结尾处端口下的命令输出中。

4.    要获取容器的 IP 地址,请使用 docker 检查命令:

请务必用集装箱的 ID 编号替换 112233445566

$ IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)

注意:容器的 IP 地址已保存到 IPADDR 中。只有在您使用 BRIDGE 网络模式时才使用此命令。

如果您正在使用 AWSVPC 网络模式,请使用分配给任务弹性网络接口的任务 IP 地址。如果您正在使用托管网络模式,请使用任务已暴露的主机 IP 地址。

5.    要获取状态代码,请运行一个包含 IPADDR 和本地侦听器端口的 curl命令。例如,如果您在监听 8080 端口且运行状况检查路径为 /health 的容器上运行 curl 命令,则该命令必须返回 200 OK 响应代码:

curl -I http://${IPADDR}:8080/health

如果您收到“非 HTTP”错误消息,则您的应用程序并未侦听到 HTTP 流量。如果您收到的 HTTP 状态代码与您在 Matcher 设置中指定的不同,说明您的应用程序正在侦听,但没有返回目标实例运行状况良好的状态代码。

检查容器实例的状态

假设您从 AWS ECS 服务事件中收到以下事件消息:

在 (目标组 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)中 (service AWS-Service) (实列 i-1234567890abcdefg)(端口 443) 运行状况不佳,其原因是(运行状况检查失败)

通过在 Amazon EC2 控制台上查看状态检查来检查您容器实例的状态。如果您的实例未通过系统状态检查,请尝试停止并启动您的实例


这篇文章对您有帮助吗?


您是否需要账单或技术支持?