AWS ECS 服务 运行 网络负载均衡器背后的 SSH + 目标组使用 CodeDeploy 部署缓慢
AWS ECS service running SSH behind Network Load Balancer + Target Group slow to deploy with CodeDeploy
我有一个服务于 SSH 进程的 ECS 服务。我正在通过 CodeDeploy 部署对此服务的更新。我注意到,与使用 CodePipeline 同时部署相同映像的其他服务相比,此服务的部署速度要慢得多。此服务的不同之处在于它在 NLB 之后(其他没有 LB 或在 ALB 之后)。
服务设置为 1 个容器,部署 200%/100%,因此服务会启动 1 个新容器,确保其健康,然后删除旧容器。我看到的情况是:
- 新容器在
Initial
状态下启动
- 3 分钟后,New Container 变为
Healthy
。旧容器进入 Draining
- 2 分钟后,旧容器完成
Draining
并停止
部署因此需要 5-7 分钟,主要是等待健康检查或排空。但是,我很确定 SSH 启动得非常快,并且我在目标组上进行了以下设置,应该可以使事情相对快速:
- 正确端口上的 TCP 健康检查
- Healthy/Unhealthy 阈值:2
- 间隔:10s
- 注销延迟:10s
- ECS Docker停止自定义超时:65s
所以从 SSH 到旧容器被终止的最短时间是:
- 2*10=20s TCP健康检查转为Healthy
- Docker 停止前注销延迟 10 秒
- 65 秒 Docker 停止超时
这是 115 秒,比观察到的 5-7 分钟少很多。其他服务需要 1-3 分钟,LB/Target 那里的团体时间几乎没有那么激进。
知道为什么我的 NLB 服务在这些生命周期转换中循环缓慢吗?
你没有做错任何事;这似乎只是该产品的(当前)限制。
我最近注意到 NLB 后面的 ECS 服务在 registration/availability 时间上有类似的延迟,因此决定探索一下。我创建了一个简单的 Javascript TCP 回显服务器并将其设置为 NLB 后面的 ECS 服务(ECS 服务计数为 1)。像你一样,我使用了 TCP 健康检查,healthy/unhealthy 阈值为 2,interval/deregistration 延迟为 10 秒。
在初始部署成功并且可以通过 NLB 访问服务后,我想看看在底层实例完全失败的情况下需要多长时间才能恢复服务。为了模拟,我通过 ECS 控制台终止了该服务。在这个测试的几次迭代之后,我一直观察到类似于以下的时间线(时间以秒为单位):
0s: killed service
5s: ECS reports old service draining
Target Group shows service draining
ECS reports new service instance is started
15s: ECS reports new task is registered
Target Group shows new instance with status of 'initial'
135s: TCP healthcheck traffic from the load balancer starts arriving
for the service (as measured by tcpdump on the EC2 host running
the container)
225s: Target Group finally marks the service as 'healthy'
ECS reports service has reached a steady state
我在 ALB 后面使用一个简单的快速应用程序执行了相同的测试,ECS 启动服务和 ALB 报告它健康之间的间隔为 10-15 秒。我们测试 NLB 的最佳结果是从服务停止到完全可用仅需 3.5 分钟。
我通过支持案例与 AWS 分享了这些发现,特别要求澄清为什么在 NLB 开始对服务进行健康检查之前始终存在 120 秒的间隔,以及为什么我们在健康检查开始和健康检查之间始终看到 90-120 秒服务可用性。他们确认这种行为是已知的,但没有提供解决时间或减少服务可用性延迟的策略。
不幸的是,这对解决您的问题没有多大帮助,但至少您可以知道自己没有做错任何事情。
我有一个服务于 SSH 进程的 ECS 服务。我正在通过 CodeDeploy 部署对此服务的更新。我注意到,与使用 CodePipeline 同时部署相同映像的其他服务相比,此服务的部署速度要慢得多。此服务的不同之处在于它在 NLB 之后(其他没有 LB 或在 ALB 之后)。
服务设置为 1 个容器,部署 200%/100%,因此服务会启动 1 个新容器,确保其健康,然后删除旧容器。我看到的情况是:
- 新容器在
Initial
状态下启动 - 3 分钟后,New Container 变为
Healthy
。旧容器进入Draining
- 2 分钟后,旧容器完成
Draining
并停止
部署因此需要 5-7 分钟,主要是等待健康检查或排空。但是,我很确定 SSH 启动得非常快,并且我在目标组上进行了以下设置,应该可以使事情相对快速:
- 正确端口上的 TCP 健康检查
- Healthy/Unhealthy 阈值:2
- 间隔:10s
- 注销延迟:10s
- ECS Docker停止自定义超时:65s
所以从 SSH 到旧容器被终止的最短时间是:
- 2*10=20s TCP健康检查转为Healthy
- Docker 停止前注销延迟 10 秒
- 65 秒 Docker 停止超时
这是 115 秒,比观察到的 5-7 分钟少很多。其他服务需要 1-3 分钟,LB/Target 那里的团体时间几乎没有那么激进。
知道为什么我的 NLB 服务在这些生命周期转换中循环缓慢吗?
你没有做错任何事;这似乎只是该产品的(当前)限制。
我最近注意到 NLB 后面的 ECS 服务在 registration/availability 时间上有类似的延迟,因此决定探索一下。我创建了一个简单的 Javascript TCP 回显服务器并将其设置为 NLB 后面的 ECS 服务(ECS 服务计数为 1)。像你一样,我使用了 TCP 健康检查,healthy/unhealthy 阈值为 2,interval/deregistration 延迟为 10 秒。
在初始部署成功并且可以通过 NLB 访问服务后,我想看看在底层实例完全失败的情况下需要多长时间才能恢复服务。为了模拟,我通过 ECS 控制台终止了该服务。在这个测试的几次迭代之后,我一直观察到类似于以下的时间线(时间以秒为单位):
0s: killed service
5s: ECS reports old service draining
Target Group shows service draining
ECS reports new service instance is started
15s: ECS reports new task is registered
Target Group shows new instance with status of 'initial'
135s: TCP healthcheck traffic from the load balancer starts arriving
for the service (as measured by tcpdump on the EC2 host running
the container)
225s: Target Group finally marks the service as 'healthy'
ECS reports service has reached a steady state
我在 ALB 后面使用一个简单的快速应用程序执行了相同的测试,ECS 启动服务和 ALB 报告它健康之间的间隔为 10-15 秒。我们测试 NLB 的最佳结果是从服务停止到完全可用仅需 3.5 分钟。
我通过支持案例与 AWS 分享了这些发现,特别要求澄清为什么在 NLB 开始对服务进行健康检查之前始终存在 120 秒的间隔,以及为什么我们在健康检查开始和健康检查之间始终看到 90-120 秒服务可用性。他们确认这种行为是已知的,但没有提供解决时间或减少服务可用性延迟的策略。
不幸的是,这对解决您的问题没有多大帮助,但至少您可以知道自己没有做错任何事情。