管理手动扩展的集群

管理手动扩展的集群

我正在开发一个 AWS 托管的 Web 服务,该服务允许用户启动一个盒子,在其上执行一项作业,然后将该盒子关闭。因为这依赖于 GPU 的独占使用,所以它不是标准容器 + ELB 问题——该任务需要是该盒子上唯一运行的东西,当它完成时,我想终止该实例。

我对 Terraform 进行了研究,但似乎它的状态性性质使其很难像这样启动和关闭盒子(我必须不断更改 .tf 文件来添加或删除机器)。我说得对吗?

理想情况下,我希望有一个“ip_address_of_new_box = api.provisionNewBoxInVPCAndRunContainer()”调用。然后我可以将该 IP 地址放入我的数据库中,然后服务会轮询它,直到它完成任务,此时它会调用“api.shutDownBox(ip_address_of_new_box)”

我是否必须使用 Boto 手动进行管理,或者我可以在这里做一些聪明的事情?

谢谢!

答案1

您这里的问题肯定不是“标准”Terraform 用例。这似乎可以分为三个子问题:

  1. 创建具有特定配置的 EC2 实例并在其上启动一些软件。
  2. 监控新机器上任务的完成情况。
  3. 终止 EC2 实例。

Terraform 可以通过一些稍微不寻常的用法帮助您解决子问题 1 和 3:

  • 编写一个 Terraform 配置,描述 EC2 实例以及在其上启动软件所需的任何配置。
  • 运行terraform apply以创建实例,并将状态文件存储在作业完成后可以找到的某个地方。
  • 使用 Terraform 之外的某些机制等待作业完成。
  • 检索先前存储的状态并运行terraform destroy以关闭实例。

这假设有一些编排脚本包装这个过程,使用 Terraform 作为步骤 1 和 3 的实现。

Terraform 带来的作用是自动维护状态(实际上,在这种情况下只是实例 id),以便可以干净地关闭实例,但是如果您确定 EC2 实例就是您所需要的,那么 Terraform 在这里可能会有点矫枉过正,而不是直接使用 EC2 API 并在某些特定于应用程序的存储中自行保留实例 id 和 IP 地址。


另一种选择是使用外部编排服务,例如AWS 数据管道,它可以协调启动实例,在其上运行计算任务,将结果保存在某处,然后关闭实例。

在这种情况下,将会有一个一次性任务来设置数据管道本身和相关的任务运行器,以启动您的 EC2 实例,然后持续使用将涉及使用数据管道 API 触发管道。

原则上,Terraform 可用于协调数据管道的一次性设置以及其配置的持续更改。然而,在撰写本文时,Terraform 尚不支持数据管道,因此需要采用替代方法。

相关内容