在现实世界中扩展Docker容器

我有一些关于扩展Docker容器的基本问题:

我有5个不同的应用程序。 他们没有互相连接。 在拥有容器之前,我会为每个虚拟机运行1个应用程序,并在云中单独进行扩展和缩放。

现在使用容器,我在虚拟机上获得了隔离,所以现在我可以运行一个具有5个Docker容器的主机,每个应用程序都被隔离在自己的容器中。

只要我的主机上有足够的资源,随着stream量的增长或减less,我可以逐个扩展和缩小这些容器。 例如我有3个容器运行应用程序1,但只有1个容器运行应用程序2。

在高峰时间的应用程序3获取大量的stream量,我需要启动第二个主机只运行应用程序的容器3。

我的第一个问题是,如果上述内容是有道理的,或者我误解了某些东西。 我的第二个问题是目前有哪些技术能够以自动化的方式完成这一切。 我需要一个负载平衡器和一个能够实现上述场景的自动扩展组,而不需要我手动干预。

我研究了AWS ECS,我不太清楚它是否能够满足我的需求,正如我上面所概述的。

有谁知道如何做到这一点,还是有一个更好的方式来pipe理和扩大我的5个应用程序,我失踪?

更新:

通过Twitter,我已经指出了Kubernetes ,特别是针对Horizo​​ntal Pod Autoscaler的文档。

也可能对其他人有用。 我会更新这个问题,因为我了解更多。

有几种select,但是我不知道这一切:你需要两件事:根据信号自动缩放主机,然后在主机上自动缩放容器。

以下是在主机上部署和扩展容器的解决scheme(不一定是自动缩放):

Kubernetes是一个编排工具,它允许计划和(通过可选的自动调节器)在集群中自动缩放容器(容器组)。 如果主机发生故障,它会确保您的容器正在运行。 Google容器引擎(GKE)将此作为服务提供,但我不确定它们是否具有相同的function来自动缩放AWS中集群中虚拟机的数量。

Mesos :有点类似于Kubernetes,但并不专用于运行容器。

Docker Swarm :Docker多主机部署解决scheme,允许您控制许多主机,就好像它们是单个Docker主机一样。 我不认为它具有任何“自动缩放”function,我不相信它确保pods总是在某处运行:它基本上是集群的docker工人。

[编辑] Docker支持使用restart=always选项重启失败的容器,自Docker 1.11起,Docker Swarm是Docker Daemon中的一种模式,并支持在节点失败时重新调度容器:如果节点是不再可用。

Docker 1.11+在function上变得和Kubernetes非常相似。 它有一些很好的function(比如默认的TLS节点之间),但是仍然缺乏静态IP和存储configuration

这些解决scheme都不会自动调整主机的数量,但可以扩展主机上的容器数量。

对于自动调节主机,解决scheme是特定于您的云提供商的,所以这些都是专用的解决scheme。 您的关键部分是整合两者:AWS允许在CoreOS上部署Kubernetes; 我不认为他们提供这个服务,所以你需要部署你自己的CoreOS集群和Kubernetes。

现在我的个人意见(和免责声明)

我大概在6个月前使用了GKE和裸机上的Kubernetes以及Swarm,并且我在GKE上运行了35个服务:

坦率地说,GK和Kubernetes即服务提供了大部分你想要的,但不是AWS。 扩展主机仍然有点棘手,需要一些工作。

在AWS或裸机上设置您自己的Kubernetes或Mesos是非常可行的,但是有一个相当的学习曲线:这完全取决于您是否真的感到在AWS上,并愿意花时间。

Swarm可能是最容易使用的工具,但是更为有限,但是自制脚本可以很好地完成工作核心工作:使用AWS API来扩展主机,并使用Swarm进行部署。 可用性保证虽然会要求您监视并处理重新启动容器,如果一个节点失败。

除此之外,也有容器托pipe服务提供商可以为你做这项工作:

我会看看Tutum(实际上最近被Docker收购)。 它连接到CI,我相信它具有自动缩放function。

https://www.tutum.co/

更新: AWS ECS支持任务放置约束 。

  1. 让您的ECS集群由两个自动缩放组(ASG)提供服务。
  2. 在第一个ASG中,将minmaxdesired大小都设置为1。

    使用自定义属性 ALLOW_ALL_APPS = TRUE标记此实例。 在用户数据脚本中执行此操作。

  3. 在第二个ASG中,将mindesired大小设置为0,并将max大小设置为1(我假设您只需要2个实例)。

    使用自定义属性ALLOW_ALL_APPS = FALSE标记此实例。 再次在用户数据脚本中。

  4. 第二台ASG的扩展告警将由第一台ASG的负载决定。

    如果您知道应用程序3的高峰时间,则可以预先通过预定的缩放操作将其颠覆。

  5. 当第二个ASG的负载下降到足以让第一个ASG自己处理的时候,缩小第二个ASG。

  6. 在应用程序1,2,4和5的服务定义中,您将具有放置约束,限制它们仅在ALLOW_ALL_APPS = TRUE节点上运行。

  7. 在应用程序3的服务定义中没有放置约束。

  8. 服务自动缩放是根据容器或应用程序指标为所有应用程序configuration的。