docker - 容器技术: docker, rkt, orchestration, kubernetes, GKE and AWS Container Service

标签 docker containers kubernetes rkt

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

这是我的外行的理解;希望对我的理解有任何更正和反馈

  • 容器:自包含的软件包,包括应用程序,运行时环境,系统库等;像带有应用程序的迷你OS
  • 似乎Docker是事实上的标准。还有其他值得注意的和广泛使用的吗?
  • 容器集群:共享资源
  • 的容器组
  • 容器引擎:将容器分组到集群中,管理资源
  • Orchestrator:这与容器引擎有什么不同吗?怎么样?
  • Docker Engine,rkt,Kubernetes,Google Container Engine,AWS Container Service等在哪里介于#s 2-4之间?
  • 最佳答案

    这可能会有点长,并且存在一些过分简化的问题,但应该足以使您理解。

    物理机器

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

    Traditional model

    该模型的缺点是:

  • 进程可能彼此干扰(因为它们共享CPU和文件系统资源),并且一个进程可能影响另一个进程的性能。
  • 扩展/缩减该系统也很困难,这需要花费大量的精力和时间来设置新的物理计算机。
  • 物理机器的硬件规格,操作系统/内核版本和软件包版本可能有所不同,这使得难以以与硬件无关的方式管理这些应用程序实例。

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

    虚拟机

    虚拟机解决了上述一些问题:
  • 即使在同一台计算机上运行,​​它们也提供隔离。
  • 它们提供了标准的执行环境( guest OS),而与底层硬件无关。
  • 在扩展时(几分钟),可以很快地将它们在另一台计算机上(复制)启动。
  • 从物理硬件转移到虚拟机通常不需要重新设计应用程序。

  • vms

    但是他们引入了一些自己的问题:
  • 它们在运行整个操作系统实例时会消耗大量资源。
  • 它们的启动/下降速度可能不如我们希望的速度(秒级)。
  • 即使使用硬件辅助的虚拟化,与直接在主机上运行的应用程序相比,应用程序实例的性能可能也会明显下降。
    (这可能仅对于某些类型的应用程序是一个问题)
  • 打包和分发VM镜像并非如此简单。
    (这不是该方法的缺点,而是现有的虚拟化工具的缺点。)

  • 货柜

    然后,沿着这条线的某个地方,将cgroups (control groups)添加到了Linux内核中。通过此功能,我们可以将组中的进程隔离开来,确定它们可以看到哪些其他进程和文件系统,并在组级别执行资源统计。

    随之而来的是各种容器运行时和引擎,这使得在OS中创建“容器”,环境(如 namespace ,可见性,资源等有限)的过程非常容易。这些的常见示例包括docker,rkt,runC,LXC等。

    containers

    docker/rkt/...

    例如,Docker包括一个守护程序,该守护程序提供诸如创建“图像”之类的交互,该可重用实体可以立即启动到容器中,而可重复使用实体。它还使人们能够以一种直观的方式管理各个容器。

    容器的优点:
  • 它们重量轻,并且运行时开销很少,因为它们没有自己的内核/OS实例,并且在单个主机OS上运行。
  • 它们在各种容器之间提供一定程度的隔离,并且能够对它们消耗的各种资源施加限制(使用cgroup机制)。
  • 围绕它们的工具发展 swift ,可以轻松构建可重复使用的单元(图像),用于存储图像修订的存储库(容器注册表)等,这在很大程度上是由于docker所致。
  • 鼓励单个容器运行单个应用程序进程,以便独立维护和分发它。容器的轻质性使其成为优选,并由于去耦而导致更快的显影。

  • 也有一些缺点:
  • 提供的隔离级别低于VM。
  • 它们最容易与重新构建的无状态12-factor应用程序一起使用,如果尝试部署旧版应用程序,集群分布式数据库等,则会有些困难。
  • 他们需要业务流程和更高级别的原语才能有效并大规模使用。

  • 容器编排

    在生产环境中运行应用程序时,随着复杂性的增加,它倾向于具有许多不同的组件,其中某些组件会根据需要进行放大/缩小,或者可能需要进行缩放。容器本身并不能解决我们所有的问题。我们需要一个能够解决与大型应用程序相关的问题的系统,例如:
  • 容器之间的网络
  • 负载均衡
  • 管理附加到这些容器的存储
  • 更新容器,对其进行缩放,将它们分布在多节点集群中的各个节点上,等等。

  • 当我们要管理容器集群时,我们使用容器编排引擎。这些示例包括Kubernetes,Mesos,Docker Swarm等。除了上面列出的功能之外,它们还提供了许多功能,目标是减少开发人员的工作量。

    orchestration

    GKE(Google容器引擎)托管在Google Cloud Platform上的Kubernetes。它使用户可以简单地指定他们需要一个n节点kubernetes集群,并将该集群本身公开为托管实例。 Kubernetes is open source,如果愿意的话,还可以在Google Compute Engine,其他云提供商或他们自己的数据中心内的计算机上进行设置。

    ECS是由Amazon构建和运营的专有容器管理/编排系统,可作为AWS套件的一部分使用。

    关于docker - 容器技术: docker, rkt, orchestration, kubernetes, GKE and AWS Container Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164597/

    相关文章:

    azure - 部署使用 istio 的服务时应创建/使用哪些角色?

    docker - 无法将 docker url 与 PHP 单元连接

    docker中的Java应用程序: Failed to get driver instance for postgres

    azure - 不为入口资源创建 DNS 记录

    javascript - jQuery:访问唯一父级中包含的唯一对象?

    c++ - 在C++容器中作为模板参数提供的分配器与作为构造函数参数提供的分配器之间的区别?

    kubernetes - 向 eks 添加多个节点组

    amazon-web-services - docker-compose.yaml 定义的 AWS ECS 任务的软内存限制

    docker - 将容器与在单个Vagrant VM中运行的Kubernetes连接

    c++ - 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?