【问题标题】:Scaling Docker containers in the real world在现实世界中扩展 Docker 容器
【发布时间】:2016-04-09 06:58:03
【问题描述】:

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

我有 5 个不同的应用程序。它们没有相互连接。在拥有容器之前,我会在每个虚拟机上运行 1 个应用程序,并在云中单独对它们进行扩展和缩减。

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

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

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

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

我研究了 AWS ECS,但不确定它是否能满足我上面概述的需求。

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

更新:

通过 Twitter,我被指向 Kubernetes,特别是 Horizontal Pod Autoscaler 上的文档。

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

【问题讨论】:

  • 在 StackOverflow 上应该不可能在不提供评论的情况下对问题投反对票 -.-
  • 好吧,也许你是对的,但是今天关于 DevOps 问题的界限在哪里?是更多的 Dev 还是更多的 Ops?这个问题也很相似,没有被否决:stackoverflow.com/questions/18285212/…
  • 这是一条越来越模糊的界限。我只是告诉你为什么你可能会被否决。我不能告诉你为什么另一个问题没有得到反对,它似乎也更适合服务器故障。我不是要证明反对票的合理性,或者证明 stackexchange 站点的分离是合理的,我只是想让你知道为什么我在这里经常看到反对票。我个人认为,软件工程师天生需要分离和编码事物,因此将 stackexchange 网络分成了太多主题重叠的站点。
  • 我建议在这里发出一些声音:meta.stackoverflow.com/questions/271279/… 我的 DevOps 问题也总是被否决,无论我是否将其发布在 StackOverflow 或 ServerFault 上,而 PowerUser 上没有人回应。
  • @poida 我们最终同时使用了 Kubernetes 和 AWS ECS。在撰写此问题时,AWS ECS 与今天不同,尤其是新的应用程序负载均衡器带来了巨大的变化。我们有两个不同的团队,一个现在使用 Kubernetes,另一个使用 AWS ECS。我认为两者看起来都很开心。

标签: amazon-web-services docker scalability kubernetes


【解决方案1】:

更新:AWS ECS 支持Task Placement Constraints

  1. 让您的 ECS 集群由两个自动扩展组 (ASG) 提供服务。

  2. 在第一个 ASG 中,将 minmaxdesired 的大小全部设置为 1。

    使用custom attributeALLOW_ALL_APPS = TRUE 标记此实例。在用户数据脚本中执行此操作。

  3. 在第二个 ASG 中,将 mindesired 大小设置为 0,将 max 大小设置为 1(我假设您只需要 2 个实例)。

    使用自定义属性ALLOW_ALL_APPS = FALSE 标记此实例。再次在用户数据脚本中。

  4. 第二个 ASG 的放大警报将由第一个 ASG 上的负载决定。

    如果您知道应用 3 的高峰时间是什么时候,您可以通过预定的扩展操作抢先将其提高。

  5. 第二个 ASG 的缩减是指它的负载下降到足以让第一个 ASG 能够自行处理它。

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

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

  8. Service auto scaling 是根据容器或应用程序指标为所有应用程序配置的。

【讨论】:

    【解决方案2】:

    有多种选择,但据我所知没有一个能做到这一点:您需要做两件事:根据信号自动缩放主机,然后在主机上自动缩放容器。

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

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

    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。

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

    大约 6 个月前,我主要在 GKE 和裸机上使用 Kubernetes,以及 Swarm a,我在 GKE 上运行了一个包含大约 35 个服务的基础设施:

    坦率地说,具有 Kubernetes 即服务的 GKE 提供了您想要的大部分功能,但它不是 AWS。扩展主机仍然有点棘手,需要一些工作。

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

    Swarm 可能是最容易使用的,但也比较有限,但是自制脚本可以很好地完成核心工作:使用 AWS API 来扩展主机,并使用 Swarm 进行部署。但是,可用性保证需要您监控并在节点发生故障时重新启动容器。

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

    【讨论】:

    • 使用云提供商 API 来扩展主机似乎是一种可行的方法 - 但自然不会独立于底层容器扩展要求(向上或向下)扩展主机。似乎需要一个控制器来管理主机和容器级别的缩放,后者触发前者(向上和向下)。
    【解决方案3】:

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

    https://www.tutum.co/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多