在现实世界中扩展 Docker 容器



我有几个关于扩展 Docker 容器的基本问题:

我有5个不同的应用程序。它们彼此之间没有连接。在拥有容器之前,我会为每个 VM 运行 1 个应用,并在云中单独扩展和缩减它们。

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

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

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

的第一个问题是,我所说的上述内容是否有意义,或者我是否误解了某些内容。我的第二个问题是,目前有什么技术可以以自动化的方式完成这一切。我需要一个负载均衡器和一个能够处理上述场景的自动扩展组,而无需进行手动干预。

我研究了 AWS ECS,不太确定它是否能满足我上面概述的需求。

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

更新:

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

可能对其他人也有用。随着我了解更多信息,我将更新这个问题。

有几个选项,但我知道没有一个可以做到这一切:您将需要 2 件事:根据信号自动缩放主机,然后在主机上自动缩放容器。

以下是在主机上部署和缩放容器的解决方案(但不一定自动缩放(:

Kubernetes 是一种编排工具,它允许调度和(使用可选的自动缩放器(自动缩放集群中的 Pod(容器组(。它可以确保在主机发生故障时容器在某个位置运行。谷歌容器引擎(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。

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

大约 6 个月前,我主要在 GKE 和裸机以及 Swarm 上使用 Kubernetes,我在 GKE 上运行了一个包含 ~35 个服务的基础设施:

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

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

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

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

  • 斯卡林戈是我知道的,但还有其他的。 https://scalingo.com/

  • OVH Sail Above 在 alpha 中提供此服务。 https://www.runabove.com/sailabove.xml

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

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 可以自行处理它的情况。

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

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

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

最新更新