ECS 滚动更新可能导致 502 Bad Gateway

Sla*_*mir 8 amazon-ecs aws-elb

我一直在 DAEMON 模式下测试 ECS 的滚动更新,但我无法避免偶尔出现“502 Bad Gateway”响应。这是我为测试所做的工作,这似乎指出了排水策略过程中的一个错误。

首先,我用 Kotlin/Jersey 编写了一个最小的 hello-world 程序来响应 curl GET(源代码)。我每约 300 毫秒循环一次到达终点:

 while [ 1 ]; do curl -s http://...us-east-2.elb.amazonaws.com/helloWorld | ts '[%Y-%m-%d %H:%M:%S]'; echo ""; sleep 0.3; done
Run Code Online (Sandbox Code Playgroud)

接下来,我推送一个新的容器镜像(使用相同的标签),它会产生稍微不同的响应(110 与 1010),以便我可以观察推出进度。最后我强制更新服务:

aws ecs update-service --service service-helloworld-jersey --cluster cluster-helloworld-jersey --force-new-deployment
Run Code Online (Sandbox Code Playgroud)

我的服务中有两项任务,最低健康百分比为50% 。Bash 循环在滚动更新期间产生以下输出 - 在某些时候有两个输出,一个带有“110”(旧代码),另一个带有“1010”(新代码),这是在其中一个容器具有已更新,另一个仍未更新:

在此处输入图片说明

如果您将 Bash 控制台上的事件与 AWS 控制台中的事件相关联(两者都是 NTP 时间同步的),您可以看到大约 9:04:39,尽管“耗尽”,我们仍在使用旧代码/容器事件应该发生在 9:04:28 之后,我在下面用红色突出显示。在 9:04:39 任务最终停止,这与循环中的“502 Bad Gateway”响应相关。

在此处输入图片说明

我的结论是 ELB 没有正确排出最后一个目标,这导致了我们看到的错误。

如果有人有任何想法如何进一步诊断或配置不同,请告诉我。


通过将 ELB 的注销延迟从 10 秒增加到 30 秒,我能够避免任何服务中断。

在此处输入图片说明