宽限期? - AWS EC2 容器服务和弹性负载均衡器

Posted

技术标签:

【中文标题】宽限期? - AWS EC2 容器服务和弹性负载均衡器【英文标题】:Grace Period? - AWS EC2 Container Service and Elastic Load Balancers 【发布时间】:2015-12-04 09:30:54 【问题描述】:

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

更新:

在我们当前的用例中,作为 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) 和 Marathon (https://mesosphere.github.io/marathon/docs/health-checks.html) 都已经支持此选项进行健康检查,如果阅读本文的人乐于不使用托管服务。

【讨论】:

我也为AWS论坛的这个问题开了一个帖子:forums.aws.amazon.com/thread.jspa?threadID=215740&tstart=0【参考方案2】:

使用环境变量 ECS_CONTAINER_STOP_TIMEOUT

见https://github.com/aws/amazon-ecs-agent/issues/126

【讨论】:

【参考方案3】:

如果其他人通过 google 发现自己在这里,在 linked support thread 中,请注意这已添加到 AWS,称为 healthCheckGracePeriodSeconds https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html#ECS-CreateService-request-healthCheckGracePeriodSeconds

【讨论】:

以上是关于宽限期? - AWS EC2 容器服务和弹性负载均衡器的主要内容,如果未能解决你的问题,请参考以下文章

具有 Auto Scaling 与弹性容器服务 (ECS) 的 AWS EC2 - Docker

《AWS云计算实战》2.五分钟搭建 WordPress 站点

我们可以将两种不同类型的 AWS EC2 实例与弹性 beantalk 负载均衡器一起使用吗

AWS EC2服务器的HTTPS负载均衡器配置过程

网络负载均衡器的AWS EC2安全组权限

AWS 通过弹性负载均衡器发送 http 请求