结合salt,docker和Amazon EC2来托pipePython应用程序

我们目前在我们公司的情况是:

  • 3个python应用程序可以根据需要多次生成
  • 托pipe所有这些应用程序的单个Amazon EC2服务器(每个应用程序有1个实例)
  • CPU利用率〜30%
  • 我们希望在1小时内完成的定期工作需要2小时(我们的应用程序的单个实例不能工作得更快 – 原因在这里不重要 – 但产生的第二个实例是诀窍)

我们希望使用docker,salt和Amazon EC2找出可自动扩展的解决scheme。 由于我没有pipe理员背景很难评估我们提出的哪些可能的解决scheme是好的,哪些是坏的。 所以我决定问你使用上述技术的经验,也许你将能够指出以下解决scheme的可能的问题:

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

这就是我们所有:)任何build议将不胜感激。 任何不同于这三者的解决scheme都是非常受欢迎的(尤其是那些已经在生产中运行的)。

是否有一个原因,你不考虑使用亚马逊的容器服务(ECS, http ://aws.amazon.com/ecs/)? 我想这将涵盖你描述的docker的场景,也许你甚至不需要盐(也许这只是我的无知,没有与它合作)。 您可以以任何您想要的方式容器化您的应用程序,创build基于ecs AMI的docker集群,并使amazon在Docker集群中执行日程安排,或者通过在需要时添加新集群节点的API自行监视资源。 来自ecs FAQ( http://aws.amazon.com/ecs/faqs/ ):

我可以安排容器的启动并pipe理整个集群的位置吗? 是。 你可以用两种方法做到这一点。 您可以select让EC2容器服务随机将您置于群集中,以尝试使用RunTask API最大化您的任务的可用性,也可以使用DescribeCluster API获取有关群集完整状态的信息。 API将返回集群中所有容器实例的数据,它们正在运行哪些任务以及哪些资源仍然可用。 通过这些信息,您可以使用StartTask API将您的群集中的特定容器实例作为目标,或使用自定义调度程序根据您的要求pipe理放置。

我认为这样可以首先将所有可用的群集节点利用率提高,然后触发新的群集节点的创build,在重新进行计算时可以将其删除。 这应该解决scheme2中的粒度问题和scheme3中的缩小问题。就复杂性而言,它至今仍然相当高,至less与scheme1相比,因为您需要将所有内容都docker化并学习ec。