在自动扩展组中的 EC2 启动和关闭时运行命令
Posted
技术标签:
【中文标题】在自动扩展组中的 EC2 启动和关闭时运行命令【英文标题】:Running command on EC2 launch and shutdown in auto-scaling group 【发布时间】:2018-06-24 20:02:09 【问题描述】:我正在运行一个部署在 AWS 上的 Docker 群。该设置是一组自动扩展的 EC2 实例,每个实例都充当 Docker swarm 节点。
当自动缩放组向外扩展(生成新实例)时,我想在实例上运行一个命令以加入 Docker 群(即docker swarm join ...
),并在它缩小(关闭实例)时离开蜂群 (docker swarm leave
)。
我知道我可以在启动配置中使用用户数据执行第一个,但我不确定如何在关机时采取行动。我想使用lifecycle hooks,文档提到我可以在启动/终止时运行自定义操作,但从未解释过如何执行此操作。应该可以不发送 SQS/SNS/Cloudwatch 事件,对吧?
我的 AMI 是基于 Ubuntu 16.04 的自定义。
谢谢。
【问题讨论】:
你真的必须离开群体吗? swarm 不会只是注意到一个实例消失了,然后将在另一个实例上运行的容器放在另一个实例上,而自动伸缩组会替换该实例吗? 另外,你为什么不使用init脚本来关闭,考虑到机器是Ubuntu,它更优雅。 脚本的最大问题是工作人员没有完全的权限将自己从 swarm 中移除。请参阅下面的答案。 【参考方案1】:其中一个核心问题是,从 Swarm 中移除节点目前是一个 2 或 3 步操作,如果优雅地完成,其中一些操作无法在要离开的节点上完成:
docker node demote
,如果离开节点是经理
docker swarm leave
离开节点
docker swarm rm
经理
第 3 步比较棘手,因为它要求您执行以下三件事之一来完成删除过程:
在 worker 上放置一些东西,让它在 manager 上远程执行操作(ssh 到具有 sudo perms 或 docker manager API 访问权限的 manager)。不是一个好主意。这打破了“工人不能做经理的事情”的安全模式,大大增加了风险,所以不推荐。我们希望我们的管理人员保持安全,我们的员工无法控制或查看群体。
(如果可能的话最好)设置一个外部解决方案,以便在删除 EC2 节点时,运行一个作业以通过 SSH 或 API 进入管理器并从 swarm 中删除该节点。我见过人们这样做,但不记得链接/repo 以获取有关使用 lambda 等处理生命周期钩子的完整详细信息。
在单个管理器(或最好作为运行 cron 容器的仅管理器服务)上设置一个简单的 cron,以删除标记为 down
的 worker。这是一种直截了当的方法,并且存在边缘情况,您可能会删除现有但被 Swarm 认为已关闭/不健康的节点,但我还没有听说过这种情况。如果它很花哨,它可能会使用 AWS 验证该节点在移除之前确实已经消失。
最坏的情况,如果一个节点严重宕机并且没有执行上述任何操作,这并不可怕,只是不适合优雅地管理用户/数据库连接。 30 秒后,一个节点被认为关闭,服务任务将在健康节点上重新创建。 swarm 节点列表中标记为down
的一长串工人列表实际上对您的服务没有影响,只是不美观(只要有足够的健康工人)。
GitHub 中有一个功能请求,可以更轻松地进行此删除。我已经评论了我在野外看到的东西。欢迎随时post your story and use case in the SwarmKit repo。
【讨论】:
以上是关于在自动扩展组中的 EC2 启动和关闭时运行命令的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?
我想在运行代码部署时在被新自动缩放组替换的 EC2 实例上运行脚本
在关闭之前检查 Auto Scaling 组中的 EC2 实例是不是有任何用户在使用它