我有一些关于扩展Docker容器的基本问题:
我有5个不同的应用。它们没有相互连接。在拥有容器之前,我会为每个VM运行1个应用程序,并在云中单独调整它们。
现在使用容器我可以在VM上获得隔离,所以现在我可以运行一个带有5个docker容器的主机,其中每个应用程序都在自己的容器中隔离。
只要我的主机上有足够的资源,我可以随着流量的增长或缩小而单独扩展和缩小这些容器。例如我有3个容器运行app 1,但只有1个容器运行app 2。
在高峰时段app 3获得了大量流量,我需要启动第二台主机,该主机只运行应用程序3的容器。
我的第一个问题是,如果上述内容有道理,或者我误解了某些内容。我的第二个问题是目前有哪些技术可以自动完成所有这些工作。我需要一个负载均衡器和一个能够实现上述场景的自动缩放组,而无需进行人工干预。
我查看了AWS ECS,并且不太确定它是否能满足我的需求,如上所述。
有谁知道如何实现这一目标,还是有更好的方法来管理和扩展我缺少的5个应用程序?
更新
通过Twitter我被指向Kubernetes,特别是Horizontal Pod Autoscaler上的文档。
也可能对其他人有用。我将在了解更多信息时更新此问题。
答案 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进行部署。但是,可用性保证需要您监视并在节点出现故障时重新启动容器。
除此之外,还有可以为您完成工作的容器托管服务提供商:
Scalingo是我所知道的,但还有其他人。 https://scalingo.com/
OVH Sail Above在alpha中提供此服务。 https://www.runabove.com/sailabove.xml
答案 1 :(得分:0)
我会看看Tutum(最近被Docker收购)。它与CI相关联,我相信它具有自动缩放功能。
答案 2 :(得分:0)
更新: AWS ECS通过Task Placement Constraints支持此功能。
在第一个ASG中,将min
,max
和desired
的尺寸设置为1。
使用custom attribute ALLOW_ALL_APPS = TRUE
标记此实例。在用户数据脚本中执行此操作。
在第二个ASG中,将min
和desired
大小设置为0,将max
大小设置为1(我假设您只需要2个实例)。
使用自定义属性ALLOW_ALL_APPS = FALSE
标记此实例。再次在用户数据脚本中。
第二个ASG的放大警报将由第一个ASG上的负载决定。
如果您知道app 3的高峰时间,您可以使用预定的缩放操作预先提升它。
缩小第二个ASG是指其负载下降到足以使第一个ASG可以自行处理它。
在适用于应用1,2,4和5的service definitions中,您会设置放置限制,限制它们仅在ALLOW_ALL_APPS = TRUE
的节点上运行。
在应用3的服务定义中,没有展示位置限制。
Service auto scaling根据容器或应用指标为所有应用配置。