【问题标题】:Container technologies: docker, rkt, orchestration, kubernetes, GKE and AWS Container Service容器技术:docker、rkt、编排、kubernetes、GKE 和 AWS Container Service
【发布时间】:2017-03-03 01:17:33
【问题描述】:

我正在努力深入了解容器技术,但有些困惑。似乎某些技术与堆栈的不同部分重叠,并且可以在 DevOps 团队认为合适的情况下使用不同技术的不同部分(例如,可以使用 Docker 容器但不必使用 Docker 引擎,可以使用来自云提供商的引擎反而)。我的困惑在于理解“容器堆栈”的每一层提供什么以及每个解决方案的关键提供者是谁。

这是我外行的理解;如有任何关于我理解中的漏洞的更正和反馈,我们将不胜感激

  1. Containers:自包含的包,包括应用程序、运行时环境、系统库等;就像一个带有应用程序的迷你操作系统
    • 似乎 Docker 是事实上的标准。还有其他值得注意且被广泛使用的吗?
  2. 容器集群:共享资源的容器组
  3. 容器引擎:将容器分组到集群中,管理资源
  4. Orchestrator:这与容器引擎有什么不同吗?如何?
    • Docker Engine、rkt、Kubernetes、Google Container Engine、AWS Container Service 等在#s 2-4 之间处于什么位置?

【问题讨论】:

  • 1. LXC,systemd-nspawn

标签: docker containers kubernetes rkt


【解决方案1】:

这可能有点长,并且过于简单化,但应该足以让人们理解这个想法。

物理机器

前段时间,部署简单应用程序的最佳方式是简单地购买一个新的网络服务器,在其上安装您最喜欢的操作系统,然后在其中运行您的应用程序。

这个模型的缺点是:

  • 进程可能会相互干扰(因为它们共享 CPU 和文件系统资源),其中一个进程可能会影响另一个进程的性能。

  • 向上/向下扩展此系统也很困难,需要花费大量精力和时间来设置新的物理机器。

  • 物理机的硬件规格、操作系统/内核版本和软件包版本可能存在差异,这使得以与硬件无关的方式管理这些应用程序实例变得困难。

    李>

应用程序直接受物理机规格影响,可能需要特定的调整、重新编译等,这意味着集群管理员需要将它们视为单个机器级别的实例。因此,这种方法无法扩展。这些属性使其不适用于部署现代生产应用程序。

虚拟机

虚拟机解决了上面的一些问题:

  • 即使在同一台机器上运行时,它们也能提供隔离。
  • 无论底层硬件如何,它们都提供标准执行环境(客户操作系统)。
  • 在扩展(以分钟为单位)时,它们可以很快地在不同的机器(复制)上启动。
  • 应用程序通常不需要重新架构即可从物理硬件迁移到虚拟机。

但是他们也引入了一些自己的问题:

  • 它们在运行整个操作系统实例时会消耗大量资源。
  • 它们可能不会像我们希望的那样快速启动/下降(以秒为单位)。
  • 即使使用硬件辅助虚拟化,与直接在主机上运行的应用程序相比,应用程序实例的性能也可能会显着下降。 (这可能只是某些应用程序的问题)

  • 打包和分发 VM 映像并非如此简单。 (这不是该方法的缺点,因为它是现有虚拟化工具的缺点。)

容器

然后,在某个地方,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 套件的一部分使用。

【讨论】:

    【解决方案2】:

    具体回答您的问题:

    1. Docker 引擎:用于管理 Docker 容器和 Docker 映像的生命周期的工具。创建、重启、删除 docker 容器。创建、重命名、删除 docker 镜像。

    2. rkt:类似于 docker 引擎,但实现方式不同

    3. Kubernetes:一组工具,用于管理使用容器的分布式应用程序的生命周期。包含用于管理容器、容器组、容器配置、编排容器、在实际实例上调度它们的工具、帮助开发人员编写和维护其他服务/工具以处理容器的工具。

    4. Google Container Engine:与其获取虚拟机,不如在其上安装“docker-engine”,在其上安装 kubernetes 并使其与基础架构的正确权限等事项一起工作。想象一下,如果一切顺利在一起,以便您可以选择机器的类型和集群的大小,所有这些都可以正常工作。从您的项目特定的 docker 存储库(谷歌容器注册表)中提取图像或声明持久卷,或配置负载平衡器等操作都可以正常工作,而无需担心服务帐户和权限等等。

    5. ECS:类似于 GKE (4),但没有 Kubernetes。

    解决您理解中的要点:您对事物的看法大致正确(我认为容器引擎除外)。重要的是要了解唯一重要的是要了解容器是什么。其余的只是营销/产品名称。同样重要的是要理解,今天对容器的理解被 Docker 容器是什么以及 Docker 和围绕 Docker 的工具强制执行的许多意见所扭曲。容器已经存在很长时间了。

    因此,一旦您了解了(docker)容器是什么,容器引擎只是管理它们的工具,容器集群只是一组容器,编排器只是管理容器运行位置的工具一些参数。恕我直言,一旦您了解并围绕容器构建了一个可靠的思维模型,您真的不需要太担心其余的工具是什么。其余的将自动适应。

    了解这一切的最佳方式是什么?使用 Docker 构建和部署一个相当复杂的应用程序(保存数据/在您的应用程序中使用数据库),一切都会变得有意义。

    【讨论】: