【编者的话】调度和编排是集群管理中的重要组成部分,本文对这两者的概念、功能和使用都做了详细的介绍,最后对目前Docker生态环境中的调度工具进行了举例。
Docker提供了编译、上传、下载、启动和停止容器的所有必要功能。对于在一个单主机环境上最小数量容器的情况下管理这些过程是很合适的。
但是,很多Docker的使用者正在应用这个平台跨多个主机管理大量的容器。集群的Docker宿主机面对特殊的管理困难需要一些不同的工具。
在这篇指南中,我们将讨论Docker调度和编排工具。他们代表主要的容器管理接口,方便分布式部署的管理员使用。
当应用被扩展到多台宿主机,管理每个宿主系统和抽象化底层平台的复杂性变得很有吸引力。编排是一个广义的概念,它是指容器调度、集群管理和可能其他主机供应配置。
在这个环境下, 调度
指的是一个管理员可以在一个宿主机上启动一个服务文件来实现如何运行特定的容器。当调度指加载服务配置的特定操作时,一个更普遍的情况下,调度器的责任是嵌入一个宿主系统来管理任何需要的服务。
容器管理是控制一组宿主机的过程。这包括添加、移除主机从一个集群中,获取宿主机或容器的当前状态信息,启动或管理进程。集群管理与调度紧密相连,因为调度必须有权限到集群中的每个宿主机来管理服务。也就是这个原因,这两个功能通常由一个工具实现。
为了在整个集群的宿主机上启动和管理容器,调度这必须与每台宿主机上的init系统进行交互。同时,为了管理的简便,调度器抽象出一个统一视图关于整个集群上所有服务的状态。这最终功能想一个集群范围的init系统。正是这个原因,许多调度器复制了init系统的命令结构。
调度器的最大的责任之一是宿主选择。如果管理员决定在集群中启动一个服务(容器),调度器通常是被要求自动的选择一个主机。管理者可以选择性提供调度限制,根据他们的要求或者需要,但是调度器是最终负责执行这些要求。
调度器通常定义一个默认调度策略。这决定了服务在没有管理员输入时将如何调度。例如,一个调度器可能选择最近激活服务的宿主机上部署新服务。
调度器通常提供覆盖机制,使得管理员可以调优特定的进程来满足特殊需求。例如,假定有两个容器必须同时运行在同一个宿主机上,因为它们作为一个单元来运行,这种关联性就可以在调度时被声明。同样,如果两个容器必须不能在同一个宿主机上运行,例如这是为了确保同一个服务的两个示例的高可用性,它也可以被预定义。
一个调度器应该注意的其他限制条件也可以通过任意的元数据来表示。单独主机可以被调度器打上标签和定位。这很有必要,例如如果一个主机包含了某个应用必须的数据卷。一些服务可能需要被部署在集群中的每个独立主机上。大多数的调度器都支持上面的操作。
调度通常捆绑在集群管理功能上,因为这两个功能都要求在特定的主机或者在集群上进行操作。
集群管理软件可能用来查询信息,关于集群中的机器,增加或者删除机器,甚至连接到某台主机上来进行更细粒度的管理操作。这些功能可能会包含在调度器中,或者是其他进程的功能。
通常来说,集群管理与服务发现工具或者分布式键值存储进行关联。它们很适合用来存储这类信息,因为信息分散在集群中,并且这种提供这种功能的平台已经存在。
由于这个,如果调度器自身并不提供方法,那么集群管理的操作可能不得不利用提供的API来修改配置值。例如,集群成员的变化可能需要通过从发现服务中的修改来处理。
键值对存储通常也是各主机元数据存储的地方。像之前提到过的一样,对主机打标签使得你可以定位不同的主机或者不同组的主机进行调度。
有事,尽管一个应用的不同组件已经被打碎成离散服务,它们依然需要被作为一个整体来管理。有时候它可能并不起作用,当部署了一个服务而没有部署另一个,因为他们相互依赖。
高级调度策略通过一些其他项目考虑了容器组的存在。这种功能获得的收益确实非常少。
分组容器管理使得管理员可以将一个集合的容器作为一个单独应用来处理。运行紧密关联的组件作为一个单元简化了应用管理,也不会牺牲功能划分带来的好处。事实上,它使得管理员从容器化和面向服务体系架构上持续保持收益,同时尽量减少额外的管理开销。
分组容器可以简化调度它们和提供同时启动或关闭的能力。它同样可以使得一些复杂的场景,例如为每组应用配置单独的子网、扩展整组的容器。
与集群管理相关的一个概念就是供应。供应是指将一个新主机上线并完成基本配置使得它们能够工作的一个过程。在Docker部署范畴中,这通常指的是配置Docker并创建新的主机到现有集群中。
供应一个主机的最终结果通常是新系统可以工作,而这其中的方法则严重依赖所使用的工具和宿主类型。例如,如果这个宿主机是个虚拟机,如 vagrant
工具可以用来创建一个新的宿主机。大多数的云提供商使得你可以通过API来创建新的宿主机。相对的,供应一些裸硬件的宿主可能需要一些手工步骤。配置工具如 Chef
、 Puppet
、 Ansible
和 Salt
可能被用来处理宿主机初始化配置,并提供相应信息来接入现有集群。
供应可能被作为管理员初始化系统的过程而忽视,或者它可能被嵌入到集群管理工具用于自动扩展。后者包括了定义需求额外主机的过程以及自动触发的条件。例如,如果你的应用的负载很高,你可能希望让你的系统增加额外的机器并水平扩展容器以缓解负载。
在基本的调度和集群管理功能方面,有如下项目:
systemd
类似的服务管理。 作为集群管理策略的一部分,Mesosphere配置依赖以下组件:
kernel
。 在高级调度和将整租容器作为一个单元方面,有以下项目:
link
来分析容器间的依赖关系。 容器管理和调度器是在分布式主机上实现容器化服务的一个关键步骤。它提供主要的管理功能为启动和控制应用提供的服务。通过实现有效的调度,可以用很少的工作就对你的应用做出重大改变。
Docker已经为开发者和管理员提供一个简单的平台来创建和部署可扩展的应用。在这个系列中,我们将探索Docker如何与其他组件整合在一起,并用它们提供的工具集来便捷地提供高可用性的分布式系统。
原文: The Docker Ecosystem: Scheduling and Orchestration (译者:陈杰)
===============================================
译者介绍
陈杰,北京理工大学计算机学院在读博士,研究方向是自然语言处理在企业网络信誉评价方面的应用,平时也乐于去实现一些突发的想法。在疲于配置系统环境时发现了Docker,跟大家一起学习、使用和研究Docker。