我有一个服务于 SSH 进程的 ECS 服务。我正在通过 CodeDeploy 为该服务部署更新。我注意到,与使用 CodePipeline 同时部署相同图像的其他服务相比,该服务的部署速度要慢得多。此服务的不同之处在于它位于 NLB 之后(其他服务不是 LB 或位于 ALB 之后)。
该服务设置为 1 个容器,部署 200%/100%,因此服务会启动 1 个新容器,确保它是健康的,然后删除旧容器。我看到发生的是:
- 新容器启动
Initial
状态 - 3 多分钟后,New Container 变为
Healthy
. 旧货柜进入Draining
- 2 分钟后,Old Container 完成
Draining
并停止
因此,部署需要 5-7 分钟,主要是等待运行状况检查或耗尽。但是,我很确定 SSH 启动得非常快,并且我在目标组上进行了以下设置,这应该会使事情变得相对快速:
- 正确端口上的 TCP 健康检查
- 健康/不健康阈值:2
- 间隔:10s
- 注销延迟:10s
- ECS Docker 停止自定义超时:65s
所以从 SSH 到旧容器被终止的最短时间是:
- 2*10=20s TCP健康检查转为Healthy
- Docker 停止前的注销延迟 10 秒
- Docker 停止超时 65 秒
这是 115 秒,比观察到的 5-7 分钟要少得多。其他服务需要 1-3 分钟,而 LB/Target Group 的时间安排并没有那么激进。
任何想法为什么我的 NLB 背后的服务似乎在这些生命周期转换中循环缓慢?