在现实世界中扩展Docker容器

时间:2016-01-05 12:36:52

标签: amazon-web-services docker scalability kubernetes

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

我有5个不同的应用。它们没有相互连接。在拥有容器之前,我会为每个VM运行1个应用程序,并在云中单独调整它们。

现在使用容器我可以在VM上获得隔离,所以现在我可以运行一个带有5个docker容器的主机,其中每个应用程序都在自己的容器中隔离。

只要我的主机上有足够的资源,我可以随着流量的增长或缩小而单独扩展和缩小这些容器。例如我有3个容器运行app 1,但只有1个容器运行app 2。

在高峰时段app 3获得了大量流量,我需要启动第二台主机,该主机只运行应用程序3的容器。

我的第一个问题是,如果上述内容有道理,或者我误解了某些内容。我的第二个问题是目前有哪些技术可以自动完成所有这些工作。我需要一个负载均衡器和一个能够实现上述场景的自动缩放组,而无需进行人工干预。

我查看了AWS ECS,并且不太确定它是否能满足我的需求,如上所述。

有谁知道如何实现这一目标,还是有更好的方法来管理和扩展我缺少的5个应用程序?

更新

通过Twitter我被指向Kubernetes,特别是Horizontal Pod Autoscaler上的文档。

也可能对其他人有用。我将在了解更多信息时更新此问题。

3 个答案:

答案 0 :(得分:4)

有几种选择,但我知道没有任何选择:你将需要两件事:根据信号自动调节主机,然后在主机上自动调节容器。

以下是在主机上部署和扩展容器的解决方案(不一定是 auto -scale):

Kubernetes 是一种编排工具,可以安排和(使用可选的自动缩放器)自动调整群集中的容器(容器组)。如果主机出现故障,它可确保您的容器在某处运行。 Google容器引擎(GKE)提供此服务,但我不确定它们是否具有与AWS一样自动调整群集中虚拟机数量的功能。

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

Docker Swarm :Docker多主机部署解决方案,允许您控制许多主机,就像它们是单个Docker主机一样。我不相信它有任何类型的自动缩放'功能,我不相信它会确保pod总是在某个地方运行:它基本上是群集的docker。

[编辑] Docker支持使用restart=always选项重新启动失败的容器,从Docker 1.11开始,Docker Swarm是Docker守护程序中的一种模式,并支持在节点故障时重新安排容器:它将重新启动容器如果某个节点不再可用,则在另一个节点上。

Docker 1.11+在功能方面变得与Kubernetes非常相似。它有一些很好的功能(默认情况下节点之间的TLS),但仍然缺少静态IP和存储配置等功能

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

对于自动扩展主机,解决方案特定于您的云提供商,因此这些是专用解决方案。关键部分是整合两者: AWS允许在CoreOS上部署Kubernetes;我不认为他们将此作为服务提供,因此您需要部署自己的CoreOS群集和Kubernetes。

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

我大部分时间都在GKE和裸机上使用Kubernetes,以及大约6个月前使用Swarm,我在GKE上运行了约35项服务:

坦率地说,使用Kubernetes即服务的GKE可以提供您想要的大部分内容,但它不是AWS。扩展主机仍然有点棘手,需要一些工作。

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

Swarm可能是最容易使用的,但更有限,但是自制脚本可以很好地完成工作核心工作:使用AWS API来扩展主机,使用Swarm进行部署。但是,可用性保证需要您监视并在节点出现故障时重新启动容器。

除此之外,还有可以为您完成工作的容器托管服务提供商:

答案 1 :(得分:0)

我会看看Tutum(最近被Docker收购)。它与CI相关联,我相信它具有自动缩放功能。

https://www.tutum.co/

答案 2 :(得分:0)

更新: AWS ECS通过Task Placement Constraints支持此功能。

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

    使用custom attribute ALLOW_ALL_APPS = TRUE标记此实例。在用户数据脚本中执行此操作。

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

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

  4. 第二个ASG的放大警报将由第一个ASG上的负载决定。

    如果您知道app 3的高峰时间,您可以使用预定的缩放操作预先提升它。

  5. 缩小第二个ASG是指其负载下降到足以使第一个ASG可以自行处理它。

  6. 在适用于应用1,2,4和5的service definitions中,您会设置放置限制,限制它们仅在ALLOW_ALL_APPS = TRUE的节点上运行。

  7. 在应用3的服务定义中,没有展示位置限制。

  8. Service auto scaling根据容器或应用指标为所有应用配置。