Docker生态系统:调度和编排
介绍
Docker 工具提供了构建、上传、下载、启动和停止容器所需的所有功能。 它非常适合在容器数量最少的单主机环境中管理这些进程。
然而,许多 Docker 用户正在利用该平台作为一种工具,以便在许多不同的主机上轻松扩展大量容器。 集群 Docker 主机提出了特殊的管理挑战,需要一组不同的工具。
在本指南中,我们将讨论 Docker 调度程序和编排工具。 这些代表分布式部署管理员的主要容器管理界面。
调度容器、编排和集群管理
当应用程序跨多个主机系统横向扩展时,管理每个主机系统并抽象出底层平台复杂性的能力变得很有吸引力。 编排是一个广义的术语,指的是容器调度、集群管理以及可能的附加主机的配置。
在这种环境中,“调度”是指管理员将服务文件加载到主机系统上的能力,该主机系统确定如何运行特定容器。 虽然调度是指加载服务定义的特定行为,但在更一般的意义上,调度程序负责连接到主机的 init 系统以管理所需容量的服务。
集群管理是控制一组主机的过程。 这可能涉及在集群中添加和删除主机,获取有关主机和容器的当前状态的信息,以及启动和停止进程。 集群管理与调度密切相关,因为调度程序必须能够访问集群中的每个主机才能调度服务。 出于这个原因,同一个工具经常用于这两个目的。
为了在整个集群的主机上运行和管理容器,调度程序必须与每个主机的独立 init 系统进行交互。 同时,为了便于管理,调度器提供了整个集群服务状态的统一视图。 这最终会像集群范围的初始化系统一样运行。 出于这个原因,许多调度程序反映了它们正在抽象的 init 系统的命令结构。
调度程序的最大职责之一是主机选择。 如果管理员决定在集群上运行服务(容器),调度程序通常负责自动选择主机。 管理员可以根据他们的需要或期望选择性地提供调度约束,但调度程序最终负责执行这些要求。
调度器如何做出调度决策?
调度器经常定义一个默认的调度策略。 这决定了在管理员未提供任何输入时如何安排服务。 例如,调度程序可能会选择将新服务放置在当前活动服务最少的主机上。
调度程序通常提供覆盖机制,管理员可以使用这些机制来微调选择过程以满足特定要求。 例如,如果两个容器应该始终运行在同一主机上,因为它们作为一个单元运行,那么通常可以在调度期间声明这种关联性。 同样,如果两个容器应该 not 放置在同一主机上,例如为了确保同一服务的两个实例的高可用性,也可以定义这一点。
调度器可能关注的其他约束可以由任意元数据表示。 单个主机可能会被调度程序标记和定位。 例如,如果主机包含应用程序所需的数据量,这可能是必要的。 某些服务可能需要部署在集群中的每个单独的主机上。 大多数调度程序允许您这样做。
调度器提供哪些集群管理功能?
调度通常与集群管理功能相关联,因为这两个功能都需要能够在特定主机和整个集群上运行。
集群管理软件可用于查询有关集群成员的信息、添加或删除成员,甚至连接到单个主机以进行更精细的管理。 这些功能可能包含在调度程序中,也可能由另一个进程负责。
通常,集群管理还与服务发现工具或分布式键值存储相关联。 这些特别适合存储此类信息,因为信息分散在整个集群本身,并且平台已经存在以实现其主要功能。
因此,如果调度程序本身不提供方法,则可能必须通过使用提供的 API 修改配置存储中的值来完成某些集群管理操作。 例如,集群成员更改可能需要通过对发现服务的原始更改来处理。
键值存储通常也是可以存储有关单个主机的元数据的位置。 如前所述,标记主机允许您针对个人或团体进行调度决策。
多容器部署如何适应调度?
有时,即使应用程序的每个组件都被分解为一个独立的服务,它们也应该作为一个单元进行管理。 有时,由于每个服务提供的功能,部署一项服务而没有另一项服务是没有意义的。
考虑到容器分组的高级调度可通过几个不同的项目获得。 用户可以从访问此功能中获得很多好处。
组容器管理允许管理员将容器集合作为单个应用程序处理。 作为一个单元运行紧密集成的组件可以简化应用程序管理,而不会牺牲划分各个功能的好处。 实际上,它允许管理员保持从容器化和面向服务的架构中获得的收益,同时最大限度地减少额外的管理开销。
将应用程序分组在一起可能意味着简单地将它们安排在一起并提供同时启动和停止它们的能力。 它还可以允许更复杂的场景,例如为每组应用程序配置单独的子网或扩展我们以前只能在容器规模上扩展的整套容器。
什么是供应?
与集群管理相关的一个概念是供应。 配置是使新主机联机并以基本方式配置它们以便它们准备好工作的过程。 对于 Docker 部署,这通常意味着配置 Docker 并设置新主机以加入现有集群。
虽然配置主机的最终结果应该始终是新系统可供工作,但方法因使用的工具和主机类型而异。 例如,如果主机是虚拟机,则可以使用 vagrant
等工具来启动新主机。 大多数云提供商允许您使用 API 创建新主机。 相比之下,提供裸硬件可能需要一些手动步骤。 可能会涉及到配置管理工具,如 Chef、Puppet、Ansible 或 Salt,以处理主机的初始配置并为其提供连接到现有集群所需的信息。
配置可能会保留为管理员启动的过程,也可能会挂接到集群管理工具中以进行自动扩展。 后一种方法涉及定义请求附加主机的过程以及应该自动触发的条件。 例如,如果您的应用程序承受着严重的负载,您可能希望您的系统启动额外的主机并在新基础设施中水平扩展容器以缓解拥塞。
有哪些常见的调度程序?
在基本调度和集群管理方面,一些热门项目有:
- fleet:Fleet是CoreOS的调度和集群管理组件。 它从 etcd 读取集群中每个主机的连接信息,并提供类似 systemd 的服务管理。
- marathon:Marathon 是 Mesosphere 安装的调度和服务管理组件。 它与 mesos 一起控制长时间运行的服务,并为进程和容器管理提供 Web UI。
- Swarm:Docker 的 Swarm 是 Docker 项目于 2014 年 12 月宣布的调度器。 它希望提供一个强大的调度程序,可以使用 Docker 原生语法在配备 Docker 的主机上启动容器。
作为集群管理策略的一部分,Mesosphere 配置依赖于以下组件:
- mesos:Apache mesos 是一个对集群中所有主机的资源进行抽象和管理的工具。 它将整个集群中可用资源的集合呈现给构建在它之上的组件(如马拉松)。 它将自己描述为类似于集群配置的“内核”。
在将容器作为一个单元进行高级调度和控制组方面,可以使用以下项目:
- kubernetes:Google 的高级调度程序,kubernetes 允许对在您的基础架构上运行的容器进行更多控制。 容器可以被标记、分组,并赋予它们自己的子网进行通信。
- compose:创建 Docker 的 compose 项目是为了允许使用声明性配置文件对容器进行组管理。 它使用 Docker 链接来了解容器之间的依赖关系。
结论
集群管理和工作调度程序是在一组分布式主机上实现容器化服务的关键部分。 它们为实际启动和控制提供应用程序的服务提供了主要的管理点。 通过有效地利用调度程序,您可以毫不费力地对您的应用程序进行重大更改。