我有几个关于扩展 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,但不专用于运行容器。
DockerSwarm: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 支持此功能。
-
让您的 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 可以自行处理它的情况。
-
在应用程序 1、2、4 和 5 的服务定义中,您将具有放置约束,限制它们仅在
ALLOW_ALL_APPS = TRUE
的节点上运行。 -
在应用 3 的服务定义中,没有放置约束。
-
服务自动缩放是根据容器或应用程序指标为所有应用配置的。