linux - 在自动缩放组中启动和关闭 EC2 时运行命令

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

我正在运行部署在 AWS 上的 Docker 集群。该设置是一组自动扩展的 EC2 实例,每个实例都充当 Docker 集群节点。

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

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

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

谢谢。

最佳答案

其中一个核心问题是,从 Swarm 中移除节点目前需要 2 步或 3 步操作才能正常完成,而其中一些操作无法在要离开的节点上完成:

  1. docker node demote,如果 leaving-node 是一个 manager
  2. docker swarm leave 在离开节点
  3. docker swarm rm 管理器

第 3 步比较棘手,因为它需要您执行以下三项操作之一才能完成删除过程:

  1. 在 worker 上放置一些东西,让它可以远程在管理器上执行操作(ssh 到具有 sudo 权限的管理器,或 docker 管理器 API 访问权限)。这不是个好主意。这打破了“worker不能做manager的事情”的安全模型,大大增加了风险,所以不推荐。我们希望我们的管理人员保持安全,并且我们的员工无法控制或了解蜂群。

  2. (如果可能最好)设置一个外部解决方案,以便在移除 EC2 节点时,运行一个作业到 SSH 或 API 到管理器中,并从 swarm 中移除节点。我见过有人这样做,但不记得有关使用 lambda 等处理生命周期 Hook 的完整详细信息的链接/存储库。

  3. 在单个管理器上设置一个简单的 cron(或者最好是作为运行 cron 容器的管理器专用服务)删除标记为 downworker。这是一种直截了当的方法,并且在某些边缘情况下,您可能会删除一个已存在但被 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/

相关文章:

c - 一个虚拟地址空间中的进程线程如何进行内存管理?

linux - VM 和本地计算机如何相互连接?

linux - docker tty 命令执行显示

laravel - npm install 并在 Docker 容器启动时运行 laravel/vue 的 dev

python - 来自不同进程的文件同时读/写操作 : working on Windows but not on Linux

linux - 无法在 Genymotion 中打开设备

amazon-web-services - 如何为 kubernetes 入口定义外部 ip

java - 在 aws 中更改 JSESSIONID 不会让我退出

javascript - AWS 签名和 Javascript

docker - 我可以在 Dockerfile FROM 语句中引用环境变量吗?