当弹性负载均衡器 (ELB) 与自动扩展组关联时,可以指定一个宽限期,在此期间,即使新的 EC2 实例被 ELB 标记为不健康,也不会终止它们。是否可以指定一个类似的宽限期,在此期间,即使运行任务的 ECS 实例已被 ELB 标记为不健康,新的 ECS 任务也不会被其关联的 ECS 服务终止和重新启动?
更新:
在我们当前的用例中,作为 ECS 任务运行的 docker 容器包含一个 JBoss 实例,该实例在启动时加载许多缓存。加载这些缓存可能需要几分钟时间。但是,ECS 服务会在容器启动后立即向 ELB 注册容器实例。这意味着流量可以在新容器准备好接受之前路由到新容器。我们可以增加健康检查间隔和 ELB 上的“健康/不健康阈值”,以防止 ELB 将流量路由到实例,并防止 ECS 服务在缓存加载之前重新启动容器。但是,增加健康检查间隔和阈值是不可取的,因为如果在加载缓存后将实例标记为不健康,ECS 服务应尽快重新启动容器(这需要更短的健康检查间隔和更小的阈值)。
因此,是否可以应用一个宽限期,在此期间,ELB 不会将流量路由到新容器,并且 ECS 服务不会重新启动容器(即使它未通过健康检查)?或者,如果失败了,是否有任何关于我们用例的解决方案的建议?
答案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) 和马拉松 (https://mesosphere.github.io/marathon/docs/health-checks.html) 已经支持此选项进行健康检查,如果读到这篇文章的人不愿意使用托管服务。