【问题标题】:How many containers should exist per host in production? How should services be split?生产中每个主机应该存在多少个容器?服务应该如何拆分?
【发布时间】:2016-12-18 23:43:08
【问题描述】:

我正在尝试更好地了解 Docker 的好处,但我并不真正了解它在生产中的工作方式。

假设我有一个 web 前端、一个 rest api 后端和一个数据库。这样就产生了 3 个容器。

假设我想要 3 个前端,5 个后端和 7 个数据库。 (小问题:数据库比后端服务器少有意义吗?)

现在,考虑到上述情况,如果我将它们全部打包在同一台主机上,那么我将获得有效利用主机资源的好处,但是当那台机器出现故障或有网络分区时,我就是 DOA。

如果我将它们分成每个主机 1 个完整的应用程序(即 1 个 FE、1 个 BE 和 1 个 DB),并在它们自己的主机上放置额外的容器,我可以获得一些有效利用资源的优势,但在我看来,我当我有一个网络分区时仍然会损失很大,因为它会关闭多项服务。

因此我几乎倾向于得出我应该为每个主机放置 1 个容器的结论,但这意味着我的资源使用效率非常低,那么容器在生产中的好处是什么?我的意思是,一个操作系统在存储大小上可能是每台机器额外的几个 gig,但大多数云提供商给你至少 10 gigs 的存储空间。让我们面对现实吧,rest api 后端或 web 前端甚至不会接近 10 场演出......甚至包括操作系统。

那么,毕竟,我想弄清楚我是否错过了容器的意义?将应用程序的所有容器保留在 1 个主机上的好处主要与测试和开发好处相关吗?

我知道在不同的提供者/机器之间轻松移动容器有好处,但在大多数情况下,我个人认为这不是一个巨大的收益,因为这对图像是可行的......

生产中的容器还有其他我缺少的好处吗?或者是测试和开发的主要好处? (我是否认为生产中的容器是错误的)?

【问题讨论】:

  • 据我所知,docker 为我带来了在生产和本地主机上的简单部署。通过一次性设置,我可以使用一个命令运行所有容器。这是另一个好处。但是我看到你的容器陷入了零停机集群,但没什么好担心的,docker 有一些方法和配置。你的方法和想法似乎没问题。

标签: docker containers


【解决方案1】:

注意:这个问题非常广泛,可能会写满整本书,但我会阐明一些观点。

容器的好处

关于容器的令人兴奋的部分不是关于它们在单个主机上的使用,而是它们在连接在大型集群上的主机之间的使用。不要将您的机器视为独立的 docker 主机,而应将其视为托管容器的资源池。

容器本身并不是开创性的(ie. Docker 的 CTO 在最后的 DockerCon 上声明“没人关心容器”),但与最先进的调度程序和容器编排框架相结合,它们成为处理生产级软件的非常强大的抽象。

关于它也适用于虚拟机的论点,是的,但容器比虚拟机具有一些技术优势(参见:How is Docker different from a normal virtual machine),这使得它们更易于使用。

在单个主机上

在单个主机上,您可以从容器中获得的好处是(以及许多其他好处):

  • 用作模仿真实生产集群行为的开发环境。
  • 独立于主机的可重现构建(方便共享)
  • 测试新软件时不会使用您不会每天使用的软件包使您的计算机膨胀。

从单个主机扩展到机器池(集群)

当需要管理生产集群时,有两种方法:

  • 通过脚本或使用 docker-compose 等解决方案“手动”创建几个 docker 主机并运行/连接容器。监控服务/容器的生命周期由您负责,您应该准备好处理服务停机时间。
  • 让容器编排器处理所有事情并监控服务的生命周期,以更好地应对故障。

有很多容器编排器:KubernetesSwarmMesosNomadCloud铸造厂,可能还有很多其他的。他们为许多大型公司和基础设施(如 Ebay)提供动力,因此他们肯定发现使用这些设施有好处。

选择正确的复制策略

容器最好用作一次性资源,这意味着您可以独立停止和重新启动数据库,并且它不应该影响后端(除了因为数据库关闭而引发错误)。因此,只要您的服务在多个主机之间正确复制,您应该能够处理任何类型的网络分区。

您需要选择适当的复制策略,以确保您的服务保持正常运行。例如,您可以跨云提供商可用区复制您的数据库,这样当整个可用区出现故障时,您的数据仍然可用。

以 Kubernetes 为例,您可以将每个容器(1 个 FE、1 个 BE 和 1 个 DB)放在一个 pod 中。 Kubernetes 将处理在许多主机上复制此 pod 并监控这些 pod 是否始终处于启动和运行状态,如果没有,将创建一个新的 pod 来应对故障。

如果您想减轻网络分区的影响,请指定节点关联性,提示调度程序将容器放置在同一机器子集上并在适当数量的主机上进行复制。

每台主机有多少个容器?

这实际上取决于您使用的机器数量和它们拥有的资源。

规则是,如果您不指定任何资源限制(在 CPU 或内存方面),则不应使用太多容器使主机膨胀。否则,您可能会危及主机并耗尽其资源,进而影响机器上的所有其他服务。良好的复制策略不仅在单个服务级别很重要,而且对于确保共享主机的服务池的健康状况也很重要。

应根据工作负载的类型处理资源限制:数据库可能会使用比前端容器更多的资源,因此您应该相应地调整大小。

例如,使用 Swarm,您可以明确指定给定服务所需的 CPU 或内存数量(请参阅docker service documentation)。尽管有很多可能性,您也可以根据 CPU 或内存使用情况给出上限/下限。根据选择的值,调度程序会将服务固定到具有可用资源的正确机器上。

Kubernetes 的工作方式几乎相同,您可以为 pod 指定限制(请参阅 documentation)。

Mesos 具有更细粒度的资源管理策略,包括框架(针对特定工作负载,如 Hadoop、Spark 等)和过度提交功能。 Mesos 对于大数据类型的工作负载特别方便。

服务应该如何拆分?

这真的取决于编排解决方案:

  • 在 Docker Swarm 中,您将为每个组件(FE、BE、DB)创建一个服务,并为每个服务设置所需的复制数。
  • 在 Kubernetes 中,您可以创建一个包含整个应用程序(FE、BE、DB 和附加到 DB 的卷)的 pod,也可以为 FE、BE、DB+volume 创建单独的 pod。

通常:每种类型的容器使用一项服务。关于容器组,评估扩展整个容器组(作为一个原子单元,即一个 pod)是否比单独管理它们更方便。

总结

容器更适合与编排框架/平台一起使用。有很多可用的解决方案来处理容器调度和资源管理。选择一个可能适合您的用例,并学习如何使用它。始终选择适当的复制策略,牢记可能的故障模式。尽可能为您的容器/服务指定资源限制,以避免可能导致主机停机的资源耗尽。

【讨论】:

  • 嗨 @abronan,当我在集群中运行的 Pod 太多(1000 个 Pod)时,你能告诉我为什么 Kubernetes 会中断(kubectl 没有回应)吗?资源绰绰有余,所以在我看来,某种控制器坏了,无法处理这么多的 Pod。
【解决方案2】:

这取决于您在容器中运行的应用程序的类型。从我的脑海中,我可以想到几种不同的方式来看待这个问题:

  • 您的应用程序磁盘空间大吗?
  • 您是否需要在多台计算机上保存应用程序失败?
  • 您能否在同一主机上运行不同应用程序的多个不同实例而不降低它们的性能?
  • 您是否使用kubernetesswarm 之类的软件来处理您的机器?

我认为即使没有容器,大多数问题也很有趣。容器可能会让您不必考虑单个主机,但您仍然必须自己决定和衡量主机的负载。

【讨论】:

    【解决方案3】:

    小问题:数据库比后端服务器少有意义吗?

    是的。

    考虑您使用普通(没有很多连接)SQL 选择语句从数据库获取数据但您的业务逻辑需要太多计算的情况。在这些情况下,您可能会考虑保持较高的后端服务计数和较低的数据库服务计数。

    这一切都取决于正在解决的用例。

    【讨论】:

      【解决方案4】:

      每台主机的容器数量取决于主机的设计比例和容器的工作负载比例。两个比率都是 吞吐量/容量比。在过去,这被称为执行/带宽的 E/B。执行是 cpu,带宽是 I/o。据说解决方案受 CPU 或 I/O 限制。

      今天内存很大,关键因素通常是cpu/nest 容量。我们将工作负载描述为 CPU 密集型或嵌套密集型。嵌套容量的一个有用代表是最高级别缓存的大小。一个有用的设计比率估计器是 (clock x cores)/cache。对于相同的核心数,设计比率较低的机器将容纳更多的容器。部分原因是具有更多缓存的机器可以更好地扩展,并且在更高的利用率下看到更少的饱和度。由

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 2014-04-20
        相关资源
        最近更新 更多