首页 文章

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

提问于
浏览
1

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

当自动缩放组向外扩展(生成新实例)时,我想在实例上运行一个命令来加入Docker swarm(即 docker swarm join ... ),当它缩小时(关闭实例)离开swarm( docker swarm leave ) .

我知道我可以在启动配置中使用用户数据做第一个,但我想'm not sure how to act on shutdown. I'喜欢使用lifecycle hooks,并且文档提到我可以在启动/终止时运行自定义操作,但它从未解释过如何做这个 . 应该可以不发送SQS / SNS / Cloudwatch活动,对吧?

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

谢谢 .

1 回答

  • 0

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

    • docker node demote ,如果leave-node是经理
      离开节点

    • docker swarm leave

    • docker swarm rm 经理

    这个步骤3很棘手,因为它要求你做三件事之一来完成删除过程:

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

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

    • 在单个管理器上设置一个简单的cron(或者最好是作为运行cron容器的仅管理器服务),删除标记为 down 的工作程序 . 这是一种直接的方法,并且有一些边缘情况,你可能会删除一个没有听说过这种情况的节点 . 如果它很花哨,它可能会通过AWS验证节点在删除之前确实已经消失了 .

    WORST CASE ,如果一个节点出现故障并且不太可怕,那么对于用户/数据库连接的优雅管理来说并不理想 . 30秒后,节点被视为关闭,并且将在 Health 节点上重新创建服务任务 . 在swarm节点列表中标记为 down 的很长的工作列表并不难看(只要有足够的 Health 工作者) .

    在GitHub中 THERE'S A FEATURE REQUEST 使这种删除更容易 . 我在野外看到了.2885816_随意post your story and use case in the SwarmKit repo .

相关问题