如何使用 Amazon EC2 启动类型运行 Amazon ECS 任务以通过 Amazon ECS 中的应用程序负载均衡器运行状况检查?

3 分钟阅读
0

Amazon Elastic Container Service(Amazon ECS)中 Amazon Elastic Compute Cloud(Amazon EC2)实例的应用程序负载均衡器运行状况检查返回了“运行不正常”的状态。我想让 EC2 实例通过运行状况检查。

简短描述

如果您的 Amazon ECS 任务未通过负载均衡器运行状况检查,您会收到来自 Amazon ECS 服务事件消息的以下一种错误消息:

  • "(service AWS-service) (port 8080) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed with these codes: [502 or 504]) or (request timeout)"
  • "(service AWS-Service) (port 8080) is unhealthy in target-group tf-20190411170 due to (reason Health checks failed)"
  • "(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"

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

"Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)"

如果您收到错误消息“(service AWS-Service) (task c13b4cb40f1f4fe4a2971f76ae5a47ad) failed container health checks”,请参阅如何解决 Amazon ECS 任务的容器运行状况检查失败问题?

**注意:**Amazon ECS 任务返回“运行不正常”状态可能的原因有很多。如以下步骤未能解决您的问题,请参阅对服务负载均衡器进行故障排除。要了解 ECS 任务停止的原因,请参阅检查已停止的任务是否存在错误

解决方法

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

要解决 Amazon ECS 任务上的负载均衡器运行状况检查问题并通过应用程序负载均衡器运行状况检查,请检查以下几个方面:

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

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

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

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

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

  • 确认与负载均衡器关联的安全组允许注册端口上流向容器实例或任务弹性网络接口的出口流量。确认与容器实例关联的运行状况检查端口也同样设置(如果适用)。
  • 确认在与负载均衡器关联的安全组设置的任务主机端口范围内,与容器实例或任务弹性网络接口关联的安全组允许所有入口流量。要检查与负载均衡器关联的安全组,请参阅应用程序负载均衡器的安全组

**重要说明:**使用动态端口映射时,服务在动态端口(通常是端口 32768 - 65535)上公开,而不是在主机端口上公开。在这种情况下,请确认容器实例安全组能反映负载均衡器为来源的入口规则中的临时端口范围。

负载均衡器与容器实例或 awsvpc 网络模式 ECS 任务弹性网络接口配置在同一可用区中

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

要找出负载均衡器配置的可用区,请完成以下步骤:

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

**注意:**对于某个应用程序负载均衡器,您可以随时启用或禁用可用区。对于某个网络负载均衡器,在启用可用区后无法再禁用,但可以启用其他可用区。

如果使用的是应用程序负载均衡器,则跨区域负载均衡始终处于启用状态。如果使用的是网络负载均衡器,则默认情况下跨区域负载均衡处于禁用状态。创建网络负载均衡器后,可以随时启用或禁用跨区域负载均衡。有关详细信息,请参阅弹性负载均衡的工作原理

要找出容器实例配置的可用区,请完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的自动扩缩下,选择自动扩缩组
  3. 选择与您的集群关联的容器实例自动扩缩组。
  4. 详细信息选项卡的网络下,验证所列可用区是否与列出的负载均衡器可用区相一致。

要修改集群的可用区,请打开 AWS CloudFormation 控制台,为您的集群选择 CloudFormation 堆栈,然后更新子网配置。要找出 awsvpc 任务弹性网络接口配置的可用区,请完成以下步骤:

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

**注意:**您无法从 Amazon ECS 控制台更改 Amazon ECS 服务的子网配置。但可以使用 AWS CLI 的 update-service 命令来更改子网配置。

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

负载均衡器和容器实例或任务弹性网络接口的子网可能不同。要确保流量能通过这些子网,请检查以下几个方面:

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

有关网络 ACL 的详细信息,请参阅使用网络 ACL

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

要确保目标组的运行状况检查设置配置正确,请完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中的负载均衡下,选择目标组
  3. 选择您的目标组。
    **重要说明:**使用新的目标组。请避免手动向目标组添加目标,因为 Amazon ECS 会自动在目标组中注册和注销容器。
  4. 运行状况检查选项卡上,输入以下信息:
    检查端口路径字段的配置是否正确。如果“端口”字段配置不正确,则负载均衡器可能会注销容器。
    对于端口,选择流量端口
    注意:如果选择覆盖,请确认指定端口与任务主机端口相匹配。
    对于超时,请确保响应超时值设置无误。
    **注意:**响应超时是一个指定时长,容器必须在此时长内对运行状况检查 ping 返回一个响应。如果此值低于响应所需的时长,则无法通过运行状况检查。

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

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

要确保 ECS 容器中的应用程序正确响应负载均衡器运行状况检查,请完成以下步骤:

  • 检查目标组的 ping 端口和运行状况检查路径配置是否正确。
  • 监控 ECS 服务的 CPU 和内存利用率指标。例如,高 CPU 利用率会使应用程序无响应并导致 502 错误或超时。
  • 定义最低运行状况检查宽限期。此设置会指示服务调度器在任务实例化后的预定义时间段内忽略弹性负载均衡运行状况检查。Amazon ECS 任务可能需要更长的运行状况检查宽限期才能注册网络负载均衡器。
  • 检查应用程序日志中是否存在应用程序错误。有关详细信息,请参阅在 CloudWatch Logs 中查看 awslogs 容器日志

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

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

**注意:**如果使用应用程序负载均衡器,可以将 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

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

  4. 要获取容器的 IP 地址,请运行 docker inspect 命令:

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

    **注意:**容器的 IP 地址保存在 IPADDR 中。只有在使用 BRIDGE 网络模式时,才能使用此命令。将 112233445566 替换为容器的 ID 编号。
    如果使用的是 awsvpc 网络模式,请使用分配给任务弹性网络接口的任务 IP 地址。如果使用的是 HOST 网络模式,请使用用于公开任务的主机的 IP 地址。

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

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

    如果收到非 HTTP 错误消息,则表明应用程序未侦听 HTTP 流量。如果您收到的 HTTP 状态代码与您在 Matcher 设置中指定的状态代码不同,则表明您的应用程序在侦听 HTTP 流量,但未返回目标运行正常的状态代码。

检查容器实例的状态

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

"(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"

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

相关信息

配置路由目标组

服务负载均衡

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