【发布时间】:2017-08-03 20:29:18
【问题描述】:
大纲:
我有一个非常简单的 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 个任务,分布在 AZ 中并使用动态端口(然后在 docker 容器中映射到 5000)
路由
每个私有子网都有一条到 10.0.0.0/19 的规则,以及一条从 0.0.0.0/0 到与其位于同一 AZ 的公有子网中的 NAT 实例的默认路由。
每个公有子网都有相同的 10.0.0.0/19 路由和 0.0.0.0/0 到互联网网关的默认路由。
安全组
我的实例位于一个组中,该组允许从 ALB 所在的安全组出口到任何地方并在端口 32768 - 65535 上入口。
ALB 位于一个安全组中,该安全组只允许在端口 80 上进入,但在我的 ECS 实例在任何端口/协议上的安全组中出口
会发生什么
当我提出这一切时,它确实有效 - 我可以获取 ALB 的公共 dns 记录并刷新,我看到我的容器应用程序返回给我的响应告诉我主机名。这正是我想要实现的然而,它未能通过运行状况检查并且容器被排空并被替换为另一个未能通过运行状况检查的容器。如此循环往复,我从未见过一次成功的健康检查。
我尝试过的
- 调整了健康检查间隔,使 ECS 需要大约 5 在终止任务之前,健康检查失败了几分钟。一世 认为这会消除它在任务时有点敏感 启动?尽管有我,这仍然会触发拆除 能够始终查看在我的浏览器中运行的应用程序。
- 以多种方式确认 /health url 端点。我可以通过 ALB 公开检索它(以及在“/”处查看主应用程序根 url),curl 告诉我有正确的 200 OK 响应(健康检查默认设置为查找)。我已经 ssh'ed 到我的 ECS 实例并在'/'和'/health'上执行了 curl --head {url} 并且都给出了 200 OK 响应。我什至在公共子网中启动了另一个实例,授予它与 ALB 安全组对我的实例相同的访问权限,并能够从那里进行运行状况检查。
总结
我可以通过负载均衡器、ECS 实例本身以及使用实例,在其主 url '/' 和运行状况检查 url '/health' 上查看我的应用程序在 AZ 和私有子网上的正确负载均衡来自 ALB 所在公共子网中另一台计算机的私有 IP 和端口。ECS 服务在没有超时的情况下无法看到此运行状况检查。我到底能错过什么?
【问题讨论】:
标签: amazon-web-services amazon-ec2 amazon-elb amazon-vpc amazon-ecs