结合 salt、docker 和 Amazon EC2 来托管 Python 应用程序

Combining salt, docker and Amazon EC2 for hosting Python application

我们公司目前的情况是:

我们想找到使用 docker、salt 和 Amazon EC2 的自动扩展解决方案。由于我没有管理背景,因此很难评估我们提出的哪些可能的解决方案是好的,哪些是坏的。因此,我决定询问您使用上述技术的经验,也许您可​​以指出以下解决方案可能存在的问题:

  1. 我们有 salt 负责单个 ec2 服务器。它正在安装所有应用程序依赖项并使用最新的应用程序版本创建 AMI 映像。然后我们使用 Amazon 自动缩放服务在需要时生成新的 AMI。
    • 优点:
      • 很简单
      • 它很灵活
      • 很好地处理硬件故障
    • 缺点:
      • 不划算
      • 我们没有使用所有资源
  2. 我们在 EC2 服务器实例上部署了固定数量的应用程序(由 docker 容器包装),例如我们 运行 始终是服务器 L4.medium 上的 3x 应用程序 A。当我们需要更多的应用程序实例时,Amazon 自动缩放会产生新的 EC2 服务器,salt 会负责处理,我们将有 3 docker 个容器,其中有应用程序 A 运行。
    • 优点:
      • 我们可以使用我们想要的任何 EC2 服务器
      • 我们可以使用特定服务器上的所有可用资源
    • 缺点:
      • 缩放的粒度:如果四个应用程序 A 实例在 1 小时 20 分钟内完成它们的工作,而我们的目标是 1 小时,我们将生成接下来的 4 个实例,然后在 40 分钟内完成工作(这是不必要的快)。
  3. 我们拥有我们想要的任何服务器,扩展意味着向现有 ec2 实例添加新的 ec2 实例或新的 docker 容器。所以换句话说,我们正在向现有机器添加新的 docker 容器,除非亚马逊自动缩放添加新的 ec2 实例。这在理论上是我们找到的最好的解决方案,但问题是我不知道它是否有可能用盐来实现。
    • 优点:
      • 灵活
      • 性价比高
      • 很酷:)
    • 缺点:
      • 最复杂的解决方案
      • 缩减问题(我们在 3 个服务器上有 6 个应用程序 A 实例,现在我们只需要 2 个,所以我们从 2 个服务器中删除 4 个实例,但那里可能有不同的应用程序阻止我们停止 ec2,所以我们有再次未使用的资源)
      • 我什至不知道从哪里开始

我们只有这些:) 如有任何建议,我们将不胜感激。非常欢迎任何与这三个不同的解决方案(特别是那些已经 运行 在生产中的某个地方)。

您是否有不考虑使用亚马逊容器服务(ecs,http://aws.amazon.com/ecs/)? I imagine this would cover the docker scenarios you describe and perhaps you would not even need salt then (maybe this is just my ignorance, not having worked with it). You could containerize your app any way you want, create a docker cluster based on the ecs AMI and have amazon do the the scheduling in your docker cluster or you monitor the resources yourself via the API adding new cluster nodes when needed. From the ecs FAQ (http://aws.amazon.com/ecs/faqs/)的原因:

Is it possible for me to schedule container launches and manage placement across a cluster? Yes. You can do this in two ways. You can choose to let EC2 Container Service randomly place you across a cluster to try and maximize the availability of your tasks using the RunTask API, or you can use the DescribeCluster API to get information about the complete state of your cluster. The API returns data on all the container instances in a cluster, what tasks they're running, and what resources are still available. With this information you can use the StartTask API to target specific Container Instances in your cluster or use a custom scheduler to manage placement based on your requirements.

我认为这样您可以首先充分利用所有可用的集群节点,然后触发创建新的集群节点,这些节点可以在您完成计算后删除。这应该解决场景 2 的粒度问题和场景 3 的缩小问题。就复杂性而言,它仍然相当高,至少与场景 1 相比,因为您需要对所有内容进行 dockerize 和学习 ecs。