如何使我的 Amazon EC2 实例通过 Amazon ECS 中的 Application Load Balancer 运行状况检查?

上次更新时间:2022 年 4 月 22 日

在 Amazon Elastic Container Service (Amazon ECS)中对一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例进行 Application Load Balancer 运行状况检查时,返回的结果为运行状况不正常。如何使我的 EC2 实例通过运行状况检查?

简要描述

要通过 Application Load Balancer 运行状况检查,请确认您已满足以下条件:

  • Amazon ECS 容器中的应用程序返回了正确的响应代码。
  • 已正确配置附加到负载均衡器和容器实例的安全组。
  • 已正确配置目标组的高级运行状况检查设置。

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

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

解决方案

确认 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

注意:本地侦听器端口位于命令输出中的 PORTS 下,箭头括号后的序列结尾处。

4.    要获取容器的 IP 地址,请使用 docker inspect 命令。请参阅以下示例:

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

注意:容器 IP 地址将被保存到 IPADDR

5.    要获取状态代码,请运行 curl 命令,其中包括 IPADDR 和本地侦听器端口。

参见以下示例,其中容器侦听端口为 8080,运行状况检查路径为 /health

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

此命令应返回 200 OK

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

正确配置附加到负载均衡器和容器实例的安全组

最佳实践是配置两个安全组,一个用于负载均衡器,一个用于容器实例。这样可确保允许负载均衡器和容器实例之间的所有流量。此外,您还需要允许您的容器实例接受来自用于动态主机端口映射的临时端口范围的流量。

1.    确认与负载均衡器关联的安全组允许发送到与容器实例关联的安全组的所有出口流量。

2.    确认与容器实例关联的安全组在临时端口范围(一般为端口 32768-65535)上允许来自与负载均衡器关联的安全组的所有入口流量。

重要提示:如果您在任务定义中声明了主机端口,则该服务会在特定的端口上暴露,而非在临时端口范围中暴露。因此,请确保您的安全组反映的是指定的主机端口,而非临时端口范围。

要检查与负载均衡器关联的安全组,请参阅 Application Load Balancer 的安全组

正确配置目标组的高级运行状况检查设置

要正确配置高级运行状况检查设置,请参阅目标组的运行状况检查。配置好高级运行状况检查设置时,请特别注意以下步骤:

1.    打开 Amazon EC2 控制台, ,选择目标组,然后选择您的目标组。

重要提示:请务必使用新的目标组。不要手动向目标组中添加目标,因为 Amazon ECS 会自动向目标组注册和注销容器。

2.    选择运行状况检查视图。

3.    对于端口,选择流量端口

注意:如果您选择了覆盖,则将无法正确路由运行状况检查流量。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?