iBl*_*aun 5 amazon-web-services amazon-elb amazon-ecs
当弹性负载均衡器 (ELB) 与自动扩展组相关联时,可以指定一个宽限期,在此宽限期内,即使新 EC2 实例被 ELB 标记为不正常,也不会终止。是否可以指定一个类似的宽限期,在此期间新的 ECS 任务不会被其关联的 ECS 服务杀死并重新启动,即使正在运行任务的 ECS 实例已被 ELB 标记为不健康?
更新:
在我们当前的用例中,作为 ECS 任务运行的 docker 容器包含一个 JBoss 实例,该实例在启动时加载许多缓存。加载这些缓存可能需要几分钟时间。但是,ECS 服务会在容器启动后立即向 ELB 注册容器实例。这意味着可以在新容器准备好接受之前将流量路由到新容器。我们可以增加 ELB 上的健康检查间隔和“健康/不健康阈值”,以防止 ELB 将流量路由到实例和 ECS 服务重新启动容器,直到缓存加载完毕。然而,增加健康检查间隔和阈值是不可取的,因为如果在加载缓存后实例被标记为不健康,
因此,是否可以应用一个宽限期,在此期间ELB不会将流量路由到新容器并且ECS服务不会重新启动容器(即使它未通过健康检查)?或者失败了,是否有关于我们用例的解决方案的任何建议?
与支持团队讨论后,发现 ECS 无法支持我们当前的用例。
有一种解决方法可以解决我们面临的问题之一。该解决方法是创建一个单独的、必要的运行状况检查容器,并在与实际应用程序容器相同的 ECS 任务中。健康检查容器的目的是监视应用程序容器以确定应用程序何时完全启动。如果检测到应用程序启动失败,则会退出,导致 ECS 服务循环执行任务。然后,ELB 配置为针对运行状况检查容器执行运行状况检查,该容器将始终通过相关端口报告其已启动。此解决方法将防止 ECS 服务因运行状况检查失败而循环执行 ECS 任务。
但是,ELB 将立即开始将流量路由到应用程序容器。即使应用程序容器尚未准备好接收流量(例如,因为它仍在等待加载缓存),它也会这样做。目前,无法延迟 ELB 将流量发送到应用程序容器,因为 ECS 服务不提供宽限期支持。我们通过 SQS 向应用程序容器提供消息,并且仅在缓存完全加载时才从队列中提取消息,从而成功解决了这个问题。然而,我们在未来的用例(例如服务网络请求)中这不是一个可行的选择。为此,我打算提出宽限期的功能请求。
顺便说一句,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)已经支持此健康检查选项,如果阅读此内容的人很高兴不使用托管服务。