7

当弹性负载均衡器 (ELB) 与自动扩展组关联时,可以指定一个宽限期,在此期间新的 EC2 实例不会被终止,即使它们被 ELB 标记为不健康。是否可以指定一个类似的宽限期,在此期间新的 ECS 任务不会被其关联的 ECS 服务杀死并重新启动,即使运行任务的 ECS 实例已被 ELB 标记为不健康?

更新:

在我们当前的用例中,作为 ECS 任务运行的 docker 容器包含一个 JBoss 实例,该实例在启动时加载许多缓存。这些缓存可能需要几分钟才能加载。但是,ECS 服务会在容器启动后立即向 ELB 注册容器实例。这意味着流量可以在准备好接受之前路由到新容器。我们可以增加 ELB 上的健康检查间隔和“健康/不健康阈值”,以防止 ELB 将流量路由到实例以及 ECS 服务在缓存加载之前重启容器。但是,增加健康检查间隔和阈值是不可取的,因为如果在加载缓存后实例被标记为不健康,

因此,是否可以应用一个宽限期,在此期间 ELB 不会将流量路由到新容器,并且 ECS 服务不会重新启动容器(即使它未通过健康检查)?或者如果做不到这一点,对于我们的用例的解决方案有什么建议吗?

4

3 回答 3

4

万一其他人通过谷歌发现自己在这里,在链接的支持线程中,注意到这已被添加到 AWS,它被称为healthCheckGracePeriodSeconds https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService。 html#ECS-CreateService-request-healthCheckGracePeriodSeconds

于 2018-05-09T20:27:45.183 回答
1

在与支持团队讨论后,发现 ECS 无法支持我们当前的用例。

有一种解决方法可以解决我们面临的问题之一。该解决方法是创建一个单独的、必要的健康检查容器,并在与实际应用程序容器相同的 ECS 任务中。健康检查容器的目的是监视应用程序容器以确定应用程序何时完全启动。如果检测到应用程序启动失败,则退出,导致 ECS 服务循环任务。然后将 ELB 配置为针对健康检查容器执行其健康检查,该容器将始终通过相关端口报告它已启动。此解决方法将防止 ECS 服务因健康检查失败而循环执行 ECS 任务。

但是,ELB 将立即开始将流量路由到应用程序容器。即使应用程序容器尚未准备好接收流量(例如,因为它仍在等待缓存加载),它也会这样做。目前,没有办法延迟 ELB 向应用程序容器发送流量,因为 ECS 服务不提供宽限期支持。我们已经设法通过 SQS 向我们的应用程序容器提供消息并仅在它们的缓存完全加载时才让它们从队列中拉出,从而解决了这个问题。但是,我们有未来的用例(例如服务 Web 请求),这不是一个可行的选择。为此,我打算提出宽限期的功能请求。

顺便说一句,Kubernetes ( http://kubernetes.io/v1.0/docs/user-guide/walkthrough/k8s201.html#application-health-checking ) 和 Marathon ( https://mesosphere.github.io/ marathon/docs/health-checks.html)已经支持此选项进行健康检查,如果有人阅读本文很高兴不使用托管服务。

于 2015-09-11T09:59:34.457 回答
0

使用环境变量 ECS_CONTAINER_STOP_TIMEOUT

请参阅https://github.com/aws/amazon-ecs-agent/issues/126

于 2016-09-15T02:54:16.957 回答