在现实世界中扩展 Docker 个容器

Scaling Docker containers in the real world

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

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

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

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

在高峰时段,应用程序 3 的流量很大,我需要启动第二台主机,运行它只是应用程序 3 的容器。

我的第一个问题是以上内容是否有道理,或者我是否误解了某些内容。我的第二个问题是目前有什么技术可以自动完成这一切。我需要一个负载均衡器和一个自动缩放组,它能够满足上述场景,而无需我进行手动干预。

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

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

更新:

通过 Twitter 我被指向 Kubernetes and specifically to the docs on the Horizontal Pod Autoscaler

可能对其他人也有用。当我了解更多时,我会更新这个问题。

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

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

Kubernetes 是一种编排工具,它允许在集群中调度和(使用可选的自动缩放器)自动缩放 pods(容器组)。如果主机出现故障,它可以确保您的容器 运行ning 在某处。 Google 容器引擎 (GKE) 将其作为一项服务提供,但我不确定它们是否具有与 AWS 相同的功能来自动缩放集群中的 VM 数量。

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

Docker Swarm:Docker multi-host 部署解决方案,允许您像控制单个主机一样控制许多主机 Docker 主机。我不相信它有任何类型的 'autoscaling' 能力,我不相信它会确保 pods 总是 运行 某处:它基本上是 docker 为集群。

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

Docker 1.11+ 在功能方面越来越像 Kubernetes。它有一些不错的功能(例如默认情况下节点之间的 TLS),但仍然缺少静态 IP 和存储配置等功能

None 这些解决方案将为您自动调整主机数量,但它们可以调整主机上的容器数量。

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

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

我主要在 GKE 和 bare-metal 上使用 Kubernetes,以及大约 6 个月前的 Swarm,我 运行 在 GKE 上使用约 35 项服务的基础设施:

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

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

Swarm 可能是最容易使用的,但更受限制,但是自制脚本可以很好地完成核心工作:使用 AWS API 扩展主机,使用 Swarm 进行部署。如果一个节点出现故障,可用性保证将需要您监控和处理 re-launching 个容器。

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

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

https://www.tutum.co/

更新: 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 上的负载决定。

    如果您知道应用程序 3 的高峰时间是什么时候,您可以通过计划的扩展操作先发制人地提高它。

  5. 当第二个 ASG 的负载下降到足以使第一个 ASG 可以自行处理时,缩减第二个 ASG。

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

  7. 在应用程序 3 的服务定义中没有放置限制。

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