我一直在 DAEMON 模式下测试 ECS 的滚动更新,我无法避免偶尔出现“502 Bad Gateway”响应。这是我为测试这一点所做的,这似乎指向了引流策略过程中的一个错误。
首先,我在 Kotlin/Jersey 中编写了一个最小的 hello-world 程序,它响应 curl GET ( source )。我每隔约 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
接下来,我推送一个新的容器镜像(使用相同的标签),它会产生稍微不同的响应(110 与 1010),以便我可以观察推出的进度。最后我强制服务更新:
aws ecs update-service --service service-helloworld-jersey --cluster cluster-helloworld-jersey --force-new-deployment
我的服务中有两项任务,最低健康百分比为 50% 。Bash 循环在滚动更新期间产生以下输出 - 在某些时候有两个输出,一个带有“110”(旧代码),另一个带有“1010”(新代码),这是在容器之一之后已更新,另一个仍未更新:
如果您将 Bash 控制台上的事件与 AWS 控制台中的事件相关联(两者都是 NTP 时间同步的),您可以看到在 9:04:39 左右,尽管“耗尽”,我们仍在访问旧代码/容器据称发生在 9:04:28 之后的事件,我在下面用红色突出显示。在 9:04:39,任务最终停止,这与循环中的“502 Bad Gateway”响应相关。
我的结论是 ELB 没有正确耗尽最后一个目标,这导致了我们看到的错误。
如果有人有任何想法如何进一步诊断或配置不同,请告诉我。
通过将 ELB 的注销延迟从 10 秒增加到 30 秒,我能够避免任何服务中断。