在自动缩放组中的EC2启动和关闭上运行命令

时间:2018-01-16 07:08:05

标签: linux amazon-web-services docker amazon-ec2 autoscaling

我正在AWS上部署Docker swarm。该设置是EC2实例的自动缩放组,每个实例都充当Docker swarm节点。

当自动缩放组缩小(生成新实例)时,我想在实例上运行命令以加入Docker swarm(即docker swarm join ...)以及何时扩展(关闭)实例)离开群体(docker swarm leave)。

我知道我可以在启动配置中使用用户数据做第一个,但我不确定如何在关机时采取行动。我想使用lifecycle hooks,文档提到我可以在启动/终止时运行自定义操作,但是从未解释过如何执行此操作。应该可以不发送SQS / SNS / Cloudwatch事件,对吧?

我的AMI是基于Ubuntu 16.04的自定义AMI。

感谢。

1 个答案:

答案 0 :(得分:0)

其中一个核心问题是,当正常完成时,从Swarm中删除节点当前是一个2步或3步操作,其中一些操作无法在离开的节点上完成:

  1. docker node demote,如果离开节点是经理
  2. 离开节点
  3. docker swarm leave
  4. docker swarm rm经理
  5. 这个步骤3很棘手,因为它要求你做三件事之一来完成删除过程:

    1. 在工作人员身上放一些东西,让它可以远程管理经理(通过sudo perms或者docker manager API访问ssh给经理)。不是个好主意。这打破了“工人不能做经理事”的安全模式,大大增加了风险,所以不推荐。我们希望我们的经理保持安全,我们的工人无法控制或了解群体。

    2. (如果可能,最好)设置外部解决方案,以便在删除EC2节点时,将作业运行到SSH或API到管理器中,并从群集中删除该节点。我见过人们这样做,但是不记得链接/回购有关使用lambda等处理生命周期钩子的完整细节。

    3. 在单个管理器上设置一个简单的cron(或者最好是作为运行cron容器的仅管理器服务),删除标记为down worker 。这是一种直接的方法,并且有一些边缘情况,你可能会删除一个现有但被群体认为已关闭/不健康的节点,但我没有听说过这种情况。如果它很花哨,它可能会通过AWS验证节点在删除之前确实已经消失了。

    4. 最糟糕的情况,如果一个节点严重失败并且没有执行上述任何操作,那么它并不可怕,只是不适合用户/数据库连接的优雅管理。 30秒后,节点被视为关闭,并且将在健康节点上重新创建服务任务。在swarm节点列表中标记为down的一长串工作人员确实对您的服务没有影响,这只是难看的(只要有足够的健康工作者)。

      GitHub中有一个功能请求,可以更轻松地删除。我评论过我在野外看到的东西。随意post your story and use case in the SwarmKit repo