AWS ECS 503服务在部署时暂时不可用

var*_*en_ 15 amazon-web-services amazon-ecs http-status-code-503 amazon-elb

我正在为我的应用程序使用带有应用程序负载均衡器的Amazon Web Services EC2容器服务.当我部署新版本时,我得到503服务暂时不可用大约2分钟.它比我的应用程序的启动时间多一点.这意味着我现在无法进行零停机部署.

是否有设置在启动时不使用新任务?或者我在这里缺少什么?

更新:

ALB的目标组的运行状况检查编号如下:

Healthy threshold:     5
Unhealthy threshold:   2
Timeout:               5 seconds
Interval:              30 seconds
Success codes:         200 OK
Run Code Online (Sandbox Code Playgroud)

健康阈值是'在考虑不健康目标健康之前所需的连续健康检查成功次数'
不健康阈值是'在考虑目标不健康之前所需的连续健康检查失败次数'.
超时是'没有响应意味着健康检查失败的时间量,以秒为单位.'
间隔是'单个目标的健康检查之间的大致时间'

更新2:所以,我的集群由两个EC2实例组成,但如果需要可以扩展.所需和最小计数为2.我为每个实例运行一个任务,因为我的应用程序需要特定的端口号.在我部署之前(jenkins运行aws cli脚本)我将实例数设置为4.如果没有这个,AWS就无法部署我的新任务(这是另一个需要解决的问题).网络模式是桥梁.

var*_*en_ 10

因此,问题似乎在于任务定义中容器设置的端口映射.在我使用80作为主机和8080作为容器端口之前.我以为我需要使用这些,但主机端口实际上可以是任何值.如果将其设置为0,则ECS将分配32768-61000范围内的端口,因此可以将多个任务添加到一个实例.为了实现这一点,我还需要更改我的安全组,让流量从ALB流向这些端口上的实例.
因此,当ECS可以在同一个实例上运行多个任务时,50/200最小/最大健康百分比是有意义的,并且可以在不需要添加新实例的情况下部署新任务修订.这也确保了零停机时间的部署.

感谢所有提出要求或评论的人!

  • 是啊谢谢。当我尝试切换到桥接网络模式时,它说这对基于 Fargate 的任务/服务无效。我们一圈又一圈地走... :) (3认同)
  • 这是否适用于 Fargate 和 awsvpc 网络?我还没有看到任何地方可以进行容器端口映射。我有同样的问题,我的健康检查不断失败,并且任务不断重新启动,因为它认为它们不可用。最后,就目前而言,我允许 404 响应作为对负载均衡器运行状况检查的有效响应,以便我的服务可以继续工作。 (2认同)
  • @Beanwah 我不太了解 Fargate 和 awsvpc。端口映射位于创建任务 -> 容器定义 -> 添加容器。对于 Fargate,其内容如下:`当任务定义的网络模式为主机或 awsvpc 时,主机端口映射无效。要指定不同的主机和容器端口映射,请选择桥接网络模式。` (2认同)

Man*_*shi 6

由于您使用的是 AWS ECS,请问该服务的“最小健康百分比”和“最大健康百分比”是多少

确保您的“最大健康百分比”为 200,“最小健康百分比”为 50,以便在部署期间不会出现所有服务停机。

请找到这两个术语的文档定义:

最大百分比提供部署期间运行任务数量的上限,使您能够定义部署批处理大小。

最低健康百分比为部署期间运行的任务数量提供了下限,使您能够在不使用额外集群容量的情况下进行部署。

“最低健康百分比”的限制为 50 将确保在部署新版本的容器之前,只有一半的服务容器被杀死,即如果服务的期望任务值是“2”而不是部署时只有具有旧版本的“1”个容器将首先被杀死,一旦部署了新版本,第二个旧容器将被杀死并部署一个新版本容器。这将确保在任何给定时间都有处理请求的服务。

类似地,“最大健康百分比”的限制为 200 告诉 ecs-agent 在部署期间的给定时间,服务的容器最多可以达到所需任务的两倍。

如果有任何进一步的问题,请告诉我。