如何找出 ECS 运行状况检查失败的原因?

Nei*_*den 8 amazon-ec2 amazon-web-services amazon-ecs amazon-elb amazon-vpc

大纲:

我有一个非常简单的 ECS 容器,它侦听端口 5000 并写出 HelloWorld,以及它正在运行的实例的主机名。我想使用 ECS 部署其中的许多容器并对它们进行负载平衡,以便真正了解其工作原理。它在一定程度上工作,但我的健康检查失败(超时),这导致容器任务上下反弹。

当前配置:

  • 1 个 VPC ( 10.0.0.0/19 )
  • 1个互联网网关
  • 3 个私有子网,一个用于 eu-west-1 中的每个可用区(10.0.0.0/24、10.0.1.0/24、10.0.2.0/24)
  • 3 个公共子网,一个用于 eu-west-1 中的每个可用区(10.0.10.0/24、10.0.11.0/24、10.0.12.0/24)
  • 3 个 NAT 实例,每个公有子网中的一个,将 0.0.0.0/0 路由到 Internet 网关,并为每个实例分配一个弹性 IP
  • 3 个 ECS 实例,每个私有子网中也有一个,并且路由到与 ECS 实例位于同一可用区中的相应公有子网中的 NAT 实例
  • 1 个 ALB 负载均衡器(面向 Internet),已在我的 3 个公共子网中注册
  • 1 个目标组(根据 ECS 文档没有注册实例),但在 /health 的“流量”端口上设置了健康检查
  • 1 服务启动 3 个分布在可用区并使用动态端口的任务(然后映射到 docker 容器中的 5000)

路由

每个私有子网都有一条到 10.0.0.0/19 的规则,以及一条到 0.0.0.0/0 的默认路由到与其相同 AZ 的公有子网中的 NAT 实例。

每个公有子网都具有相同的 10.0.0.0/19 路由和到 Internet 网关的 0.0.0.0/0 的默认路由。

安全组

我的实例位于一个组中,该组允许从 ALB 所在的安全组出口到任何地方并在端口 32768 - 65535 上进入。

ALB 位于一个安全组中,该安全组仅允许在端口 80 上进入,但到我的 ECS 实例在任何端口/协议上的安全组的出口

发生什么了

当我提出所有这些时,它确实有效 - 我可以获取 ALB 的公共 dns 记录并刷新,我看到从我的容器应用程序返回给我的响应告诉我主机名。然而,这正是我想要实现的,它未通过运行状况检查并且容器被排空,并替换为另一个未通过运行状况检查的容器。如此循环下去,我从未见过一次成功的健康检查。

我试过的

  • 调整了健康检查间隔,使 ECS 在终止任务之前需要大约 5 分钟的稳定失败的健康检查。我认为这会消除它在任务启动时有点敏感?尽管我能够始终查看在浏览器中运行的应用程序,但这仍然会继续触发拆卸。
  • 以多种方式确认 /health url 端点。我可以通过 ALB 公开检索它(以及在“/”处查看主应用程序根 URL),curl 告诉我有一个正确的 200 OK 响应(健康检查设置为默认查找)。我已通过 ssh 连接到我的 ECS 实例并在“/”和“/health”上执行 curl --head {url} 并且都给出了 200 OK 响应。我什至在公共子网中启动了另一个实例,授予它与 ALB 安全组相同的访问权限,并能够从那里卷曲运行状况检查。

概括

我可以通过负载均衡器,从 ECS 实例本身,并使用实例私有 IP 和来自 ALB 所在公共子网中另一台机器的端口。ECS 服务在没有超时的情况下无法看到此运行状况检查一次。我到底会错过什么??

Pol*_*ath 0

问题多于答案。但也许他们会带你走向正确的方向。

您说可以通过 ALB 访问容器应用程序,但节点未通过健康检查。在运行状况检查成功之前,ALB 不应允许连接到该节点。因此,如果您通过 ALB 连接到节点,则 ALB 必须经过测试并确定其运行状况良好。是否是不同的健康检查导致了节点的终止?

您是否检查过 CloudTrail,看看它是否有任何关于触发拆卸的线索?拆除是由ALB还是伸缩组触发的?是否可能是自动伸缩组的伸缩标准错误?

祝你好运