在现实世界中扩展Docker容器
我有一些关于扩展Docker容器的基本问题:
我有5个不同的应用程序。 他们没有互相连接。 在拥有容器之前,我会为每个虚拟机运行1个应用程序,并在云中单独进行扩展和缩放。
现在使用容器,我在虚拟机上获得了隔离,所以现在我可以运行一个具有5个Docker容器的主机,每个应用程序都被隔离在自己的容器中。
只要我的主机上有足够的资源,随着stream量的增长或减less,我可以逐个扩展和缩小这些容器。 例如我有3个容器运行应用程序1,但只有1个容器运行应用程序2。
在高峰时间的应用程序3获取大量的stream量,我需要启动第二个主机只运行应用程序的容器3。
我的第一个问题是,如果上述内容是有道理的,或者我误解了某些东西。 我的第二个问题是目前有哪些技术能够以自动化的方式完成这一切。 我需要一个负载平衡器和一个能够实现上述场景的自动扩展组,而不需要我手动干预。
我研究了AWS ECS,我不太清楚它是否能够满足我的需求,正如我上面所概述的。
有谁知道如何做到这一点,还是有一个更好的方式来pipe理和扩大我的5个应用程序,我失踪?
更新:
通过Twitter,我已经指出了Kubernetes ,特别是针对Horizontal 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服务提供商可以为你做这项工作:
-
Scalingo是我所知道的,但也有其他的。 https://scalingo.com/
-
OVH风帆上面有这个服务在阿尔法。 https://www.runabove.com/sailabove.xml
我会看看Tutum(实际上最近被Docker收购)。 它连接到CI,我相信它具有自动缩放function。
更新: AWS ECS支持任务放置约束 。
- 让您的ECS集群由两个自动缩放组(ASG)提供服务。
-
在第一个ASG中,将
min
,max
和desired
大小都设置为1。使用自定义属性
ALLOW_ALL_APPS = TRUE
标记此实例。 在用户数据脚本中执行此操作。 -
在第二个ASG中,将
min
和desired
大小设置为0,并将max
大小设置为1(我假设您只需要2个实例)。使用自定义属性
ALLOW_ALL_APPS = FALSE
标记此实例。 再次在用户数据脚本中。 -
第二台ASG的扩展告警将由第一台ASG的负载决定。
如果您知道应用程序3的高峰时间,则可以预先通过预定的缩放操作将其颠覆。
-
当第二个ASG的负载下降到足以让第一个ASG自己处理的时候,缩小第二个ASG。
-
在应用程序1,2,4和5的服务定义中,您将具有放置约束,限制它们仅在
ALLOW_ALL_APPS = TRUE
节点上运行。 -
在应用程序3的服务定义中没有放置约束。
-
服务自动缩放是根据容器或应用程序指标为所有应用程序configuration的。