我正在运行部署在 AWS 上的 Docker 集群。该设置是一组自动扩展的 EC2 实例,每个实例都充当 Docker 集群节点。
当自动扩展组横向扩展(产生新实例)时,我想在实例上运行一个命令以加入 Docker 群(即 docker swarm join ...
)以及何时它缩小(关闭实例)以离开集群(docker swarm leave
)。
我知道我可以在启动配置中使用用户数据执行第一个操作,但我不确定如何在关闭时执行操作。我想利用 lifecycle hooks ,并且文档提到我可以在启动/终止时运行自定义操作,但从未解释过如何执行此操作。不发送 SQS/SNS/Cloudwatch 事件应该是可以的,对吧?
我的 AMI 是基于 Ubuntu 16.04 的自定义 AMI。
谢谢。
最佳答案
其中一个核心问题是,从 Swarm 中移除节点目前需要 2 步或 3 步操作才能正常完成,而其中一些操作无法在要离开的节点上完成:
docker node demote
,如果 leaving-node 是一个 managerdocker swarm leave
在离开节点docker swarm rm
管理器
第 3 步比较棘手,因为它需要您执行以下三项操作之一才能完成删除过程:
在 worker 上放置一些东西,让它可以远程在管理器上执行操作(ssh 到具有 sudo 权限的管理器,或 docker 管理器 API 访问权限)。这不是个好主意。这打破了“worker不能做manager的事情”的安全模型,大大增加了风险,所以不推荐。我们希望我们的管理人员保持安全,并且我们的员工无法控制或了解蜂群。
(如果可能最好)设置一个外部解决方案,以便在移除 EC2 节点时,运行一个作业到 SSH 或 API 到管理器中,并从 swarm 中移除节点。我见过有人这样做,但不记得有关使用 lambda 等处理生命周期 Hook 的完整详细信息的链接/存储库。
在单个管理器上设置一个简单的 cron(或者最好是作为运行 cron 容器的管理器专用服务)删除标记为
down
的 worker。这是一种直截了当的方法,并且在某些边缘情况下,您可能会删除一个已存在但被 swarm 认为已关闭/不健康的节点,但我还没有听说过这种情况。如果它很花哨,它可能会在删除之前通过 AWS 验证该节点确实消失了。
最坏的情况,如果一个节点严重宕机并且没有执行上述任何操作,这并不可怕,只是不适合优雅地管理用户/数据库连接。 30 秒后,节点被视为关闭,服务任务将在健康节点上重新创建。在 swarm 节点列表中标记为 down
的一长串 worker 确实不会对您的服务产生影响,它只是难看(只要有足够的健康 worker)。
GitHub 中有一个功能请求 可以更轻松地进行删除。我已经评论了我在野外看到的东西。欢迎调用post your story and use case in the SwarmKit repo .
关于linux - 在自动缩放组中启动和关闭 EC2 时运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48275710/