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 个新容器,确保其健康,然后删除旧容器。我看到的情况是:

  1. 新容器在 Initial 状态下启动
  2. 3 分钟后,New Container 变为 Healthy。旧容器进入 Draining
  3. 2 分钟后,旧容器完成 Draining 并停止

部署因此需要 5-7 分钟,主要是等待健康检查或排空。但是,我很确定 SSH 启动得非常快,并且我在目标组上进行了以下设置,应该可以使事情相对快速:

所以从 SSH 到旧容器被终止的最短时间是:

这是 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 秒服务可用性。他们确认这种行为是已知的,但没有提供解决时间或减少服务可用性延迟的策略。

不幸的是,这对解决您的问题没有多大帮助,但至少您可以知道自己没有做错任何事情。