在现实世界中扩展 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 个容器。
除此之外,还有容器托管提供商可以为您完成这项工作:
Scalingo 是我所知道的,但还有其他的。 https://scalingo.com/
OVH Sail Above 在 alpha 中提供此服务。 https://www.runabove.com/sailabove.xml
我会看一下 Tutum(实际上最近被 Docker 收购)。它与 CI 相关,我相信它具有自动缩放功能。
更新: AWS ECS 支持 Task Placement Constraints。
让您的 ECS 集群由两个自动扩展组 (ASG) 提供服务。
在第一个 ASG 中,将 min
、max
和 desired
大小全部设置为 1。
用 custom attribute 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 的 service definitions 中,您将有放置约束将它们限制为 运行 仅在 ALLOW_ALL_APPS = TRUE
的节点上。
在应用程序 3 的服务定义中没有放置限制。
Service auto scaling 基于容器或应用指标为所有应用配置。
我有几个关于扩展 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 个容器。
除此之外,还有容器托管提供商可以为您完成这项工作:
Scalingo 是我所知道的,但还有其他的。 https://scalingo.com/
OVH Sail Above 在 alpha 中提供此服务。 https://www.runabove.com/sailabove.xml
我会看一下 Tutum(实际上最近被 Docker 收购)。它与 CI 相关,我相信它具有自动缩放功能。
更新: AWS ECS 支持 Task Placement Constraints。
让您的 ECS 集群由两个自动扩展组 (ASG) 提供服务。
在第一个 ASG 中,将
min
、max
和desired
大小全部设置为 1。用 custom attribute
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 的 service definitions 中,您将有放置约束将它们限制为 运行 仅在
ALLOW_ALL_APPS = TRUE
的节点上。在应用程序 3 的服务定义中没有放置限制。
Service auto scaling 基于容器或应用指标为所有应用配置。