这可能有点长,并且过于简单化,但应该足以让人们理解这个想法。
物理机器
前段时间,部署简单应用程序的最佳方式是简单地购买一个新的网络服务器,在其上安装您最喜欢的操作系统,然后在其中运行您的应用程序。
这个模型的缺点是:
进程可能会相互干扰(因为它们共享 CPU 和文件系统资源),其中一个进程可能会影响另一个进程的性能。
向上/向下扩展此系统也很困难,需要花费大量精力和时间来设置新的物理机器。
-
物理机的硬件规格、操作系统/内核版本和软件包版本可能存在差异,这使得以与硬件无关的方式管理这些应用程序实例变得困难。
李>
应用程序直接受物理机规格影响,可能需要特定的调整、重新编译等,这意味着集群管理员需要将它们视为单个机器级别的实例。因此,这种方法无法扩展。这些属性使其不适用于部署现代生产应用程序。
虚拟机
虚拟机解决了上面的一些问题:
- 即使在同一台机器上运行时,它们也能提供隔离。
- 无论底层硬件如何,它们都提供标准执行环境(客户操作系统)。
- 在扩展(以分钟为单位)时,它们可以很快地在不同的机器(复制)上启动。
- 应用程序通常不需要重新架构即可从物理硬件迁移到虚拟机。
但是他们也引入了一些自己的问题:
容器
然后,在某个地方,cgroups (control groups) 被添加到 linux 内核中。此功能使我们可以将进程隔离在组中,决定它们可以看到哪些其他进程和文件系统,并在组级别执行资源记帐。
各种容器运行时和引擎的出现使得创建“容器”的过程变得非常容易,操作系统内的环境,例如具有有限可见性、资源等的命名空间。常见的例子包括 docker、rkt、runC、LXC 等。
例如,Docker 包含一个守护进程,它提供诸如创建“图像”之类的交互,这是一个可以立即启动到容器中的可重用实体。它还可以让人们以一种直观的方式管理单个容器。
容器的优点:
- 它们重量轻,运行开销很小,因为它们没有自己的内核/操作系统实例,并且在单个主机操作系统之上运行。
- 它们在各种容器之间提供一定程度的隔离,并能够对它们消耗的各种资源施加限制(使用 cgroup 机制)。
- 围绕它们的工具发展迅速,可以轻松构建可重用单元(映像)、用于存储映像修订的存储库(容器注册表)等,这主要归功于 docker。
- 鼓励单个容器运行单个应用程序进程,以便独立维护和分发它。容器的轻量特性使其更受欢迎,并且由于解耦而导致更快的开发。
也有一些缺点:
- 提供的隔离级别低于 VM。
- 它们最容易与正在重新构建的无状态 12-factor 应用程序一起使用,如果尝试部署旧版应用程序、集群分布式数据库等,会有些困难。
- 他们需要编排和更高级别的原语才能有效地大规模使用。
容器编排
在生产环境中运行应用程序时,随着复杂性的增加,它往往会包含许多不同的组件,其中一些组件会根据需要进行扩展/缩减,或者可能需要进行扩展。容器本身并不能解决我们所有的问题。我们需要一个系统来解决与真正的大规模应用相关的问题,例如:
- 容器之间的网络
- 负载平衡
- 管理附加到这些容器的存储
- 更新容器、扩展它们、将它们分布到多节点集群中的节点等等。
当我们要管理容器集群时,我们使用容器编排引擎。这些示例包括 Kubernetes、Mesos、Docker Swarm 等。除了上面列出的功能之外,它们还提供了许多功能,目标是减少开发操作所涉及的工作量。
GKE(Google Container Engine)在 Google Cloud Platform 上托管 Kubernetes。它允许用户简单地指定他们需要一个 n 节点 kubernetes 集群,并将集群本身作为托管实例公开。 Kubernetes is open source,如果愿意,也可以在 Google Compute Engine、不同的云提供商或他们自己的数据中心中的机器上进行设置。
ECS 是由 Amazon 构建和运营的专有容器管理/编排系统,可作为 AWS 套件的一部分使用。