Docker生态系统系列之五:调度和编排

本文讲的是Docker生态系统系列之五:调度和编排,【编者的话】调度和编排是集群管理中的重要组成部分,本文对这两者的概念、功能和使用都做了详细的介绍,最后列举了目前Docker生态环境中的调度工具。容器管理和调度器是在分布式主机上实现容器化服务的一个关键步骤。它提供主要的管理功能为启动和控制应用提供的服务。实现有效的调度可以事半功倍。

介绍

Docker提供了编译、上传、下载、启动和停止容器的所有必要功能。对于在一个单主机环境上最小数量容器的情况下管理这些过程是很合适的。

但是,很多Docker的使用者正在应用这个平台跨多个主机管理大量的容器。集群的Docker宿主机面对特殊的管理困难需要一些不同的工具。

在这篇指南中,我们将讨论Docker调度和编排工具。他们代表主要的容器管理接口,方便分布式部署的管理员使用。

调度容器、编排和集群管理

当应用被扩展到多台宿主机,管理每个宿主系统和抽象化底层平台的复杂性变得更有挑战。编排是一个广义的概念,它是指容器调度、集群管理和可能其他主机供应配置。

在这个环境下,『调度』指的是一个管理员可以在一个宿主机上启动一个服务文件来实现如何运行特定的容器。当调度指加载服务配置的特定操作时,一个更普遍的情况下,调度器的责任是嵌入一个宿主系统来管理任何需要的服务。

容器管理是控制一组宿主机的过程。这包括添加、移除主机从一个集群中,获取宿主机或容器的当前状态信息,启动或管理进程。集群管理与调度紧密相连,因为调度必须有权限到集群中的每个宿主机来管理服务。也就是这个原因,这两个功能通常由一个工具实现。

为了在整个集群的宿主机上启动和管理容器,调度这必须与每台宿主机上的init系统进行交互。同时,为了管理的简便,调度器抽象出一个统一视图关于整个集群上所有服务的状态。这最终功能想一个集群范围的init系统。正是这个原因,许多调度器复制了init系统的命令结构。

调度器的最大的责任之一是宿主选择。如果管理员决定在集群中启动一个服务(容器),调度器通常是被要求自动的选择一个主机。管理者可以选择性提供调度限制,根据他们的要求或者需要,但是调度器是最终负责执行这些要求。

调度器如何做调度决策

调度器通常定义一个默认调度策略。这决定了服务在没有管理员输入时将如何调度。例如,一个调度器可能选择最近激活服务的宿主机上部署新服务。

调度器通常提供覆盖机制,使得管理员可以调优特定的进程来满足特殊需求。例如,假定有两个容器必须同时运行在同一个宿主机上,因为它们作为一个单元来运行,这种关联性就可以在调度时被声明。同样,如果两个容器必须不能在同一个宿主机上运行,例如这是为了确保同一个服务的两个示例的高可用性,它也可以被预定义。

一个调度器应该注意的其他限制条件也可以通过任意的元数据来表示。单独主机可以被调度器打上标签和定位。这很有必要,例如如果一个主机包含了某个应用必须的数据卷。一些服务可能需要被部署在集群中的每个独立主机上。大多数的调度器都支持上面的操作。

调度器提供什么样的集群管理功能

调度通常捆绑在集群管理功能上,因为这两个功能都要求在特定的主机或者在集群上进行操作。

集群管理软件可能用来查询信息,关于集群中的机器,增加或者删除机器,甚至连接到某台主机上来进行更细粒度的管理操作。这些功能可能会包含在调度器中,或者是其他进程的功能。

通常来说,集群管理与服务发现工具或者分布式键值存储进行关联。它们很适合用来存储这类信息,因为信息分散在集群中,并且这种提供这种功能的平台已经存在。

由于这个,如果调度器自身并不提供方法,那么集群管理的操作可能不得不利用提供的API来修改配置值。例如,集群成员的变化可能需要通过从发现服务中的修改来处理。

键值对存储通常也是各主机元数据存储的地方。像之前提到过的一样,对主机打标签使得你可以定位不同的主机或者不同组的主机进行调度。

多容器部署如何调度

有时,尽管一个应用的不同组件已经被打碎成离散服务,它们依然需要被作为一个整体来管理。有时候它可能并不起作用,当部署了一个服务而没有部署另一个,因为他们相互依赖。

高级调度策略通过一些其他项目考虑了容器组的存在。这种功能获得的收益确实非常少。

分组容器管理使得管理员可以将一个集合的容器作为一个单独应用来处理。运行紧密关联的组件作为一个单元简化了应用管理,也不会牺牲功能划分带来的好处。事实上,它使得管理员从容器化和面向服务体系架构上持续保持收益,同时尽量减少额外的管理开销。

分组容器可以简化调度它们和提供同时启动或关闭的能力。它同样可以使得一些复杂的场景,例如为每组应用配置单独的子网、扩展整组的容器。

供应是什么

与集群管理相关的一个概念就是供应。供应是指将一个新主机上线并完成基本配置使得它们能够工作的一个过程。在Docker部署范畴中,这通常指的是配置Docker并创建新的主机到现有集群中。

供应一个主机的最终结果通常是新系统可以工作,而这其中的方法则严重依赖所使用的工具和宿主类型。例如,如果这个宿主机是个虚拟机,如vagrant工具可以用来创建一个新的宿主机。大多数的云提供商使得你可以通过API来创建新的宿主机。相对的,供应一些裸硬件的宿主可能需要一些手工步骤。配置工具如ChefPuppetAnsibleSalt可能被用来处理宿主机初始化配置,并提供相应信息来接入现有集群。

供应可能被作为管理员初始化系统的过程而忽视,或者它可能被嵌入到集群管理工具用于自动扩展。后者包括了定义需求额外主机的过程以及自动触发的条件。例如,如果你的应用的负载很高,你可能希望让你的系统增加额外的机器并水平扩展容器以缓解负载。

常用的调度器有哪些

在基本的调度和集群管理功能方面,有如下项目:

  • fleet:Fleet是CoreOS的一个调度和集群管理组件。它从集群中etcd中读取每一个宿主机上的连接信息,然后提供systemd类似的服务管理。
  • marathon:Marathon是Mesosphere的一个调度和服务管理组件。它配合mesos来控制长时间运行的服务,并为进程和容器管理提供Web界面。
  • Swarm:Docker的Swarm是一个2014年12月发布的调度器。它旨在提供一个健壮的调度器,采用Docker原生句法使得可以在宿主机上启动容器和进行供应。

作为集群管理策略的一部分,Mesosphere配置依赖以下组件:

  • mesos:Apache mesos是一个抽象和管理集群中所有宿主资源的工具。从整个集群到构建在上面的组件,它可以表示一组可用的资源。它描述自己为集群配置的kernel

在高级调度和将整租容器作为一个单元方面,有以下项目:

  • Kubernetes:这是Google的高级调度器,kubernetes提供对你的基础设备上的容器更多的控制。容器可以被打标签、分组和配置通信子网。
  • compose:Docker的compose项目通过定义配置文件来提供容器组管理功能。它通过Docker的link来分析容器间的依赖关系。

总结

容器管理和调度器是在分布式主机上实现容器化服务的一个关键步骤。它提供主要的管理功能为启动和控制应用提供的服务。实现有效的调度可以事半功倍。

本系列的其他文章

Docker已经为开发者和管理员提供一个简单的平台来创建和部署可扩展的应用。在这个系列中,我们将探索Docker如何与其他组件整合在一起,并用它们提供的工具集来便捷地提供高可用性的分布式系统。

  1. 常用组件介绍(已翻译)
  2. 容器化的综述(已翻译)
  3. 服务发现和分布式配置存储(已翻译)
  4. 网络与通信(已翻译)
  5. 调度与编制(本文)

原文:The Docker Ecosystem: Scheduling and Orchestration(译者:陈杰)

===============================================
译者介绍
陈杰,北京理工大学计算机学院在读博士,研究方向是自然语言处理在企业网络信誉评价方面的应用,平时也乐于去实现一些突发的想法。在疲于配置系统环境时发现了Docker,跟大家一起学习、使用和研究Docker。

原文发布时间为:2015-05-23

本文作者:Sonyfe25cp

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Docker生态系统系列之五:调度和编排

时间: 2024-08-03 19:16:04

Docker生态系统系列之五:调度和编排的相关文章

Docker生态系统系列之一:常用组件介绍

本文讲的是Docker生态系统系列之一:常用组件介绍,[编者的话]本篇文章是介绍Docker生态系统的第一篇,不仅从概念上介绍了容器化.服务发现和全局配置存储.网络工具.调度.集群管理和编排这几部分内容,而且配以清晰易懂的例子进行讲解说明,非常值得读者称赞.Docker是现在使用最多的容器化软件.与其它已经存在的容器化系统相比,Docker可以更加简单的创建和管理容器,并与其它开源软件集成. 简介 容器化是一个以可移植和可预测的方式来部署分布式应用的过程,它会将应用组件以及依赖打包为一个标准.独

Docker生态系统系列之二:容器化综述

本文讲的是Docker生态系统系列之二:容器化综述,[编者的话]本篇文章是介绍Docker生态系统的第二篇,该文章首先简要介绍了Linux容器化的历史,然后介绍容器化的优点,再讨论Dockerfile的优点,最后讨论了容器化应用的架构. 应用的迁移部署是一件非常复杂的事情.我们不仅要针对每个环境单独调整,可能还会面临其它的问题,比如检查依赖.扩展应用.在不影响整体应用的情况下单独更新组件. Docker容器化的思想和面向服务式的设计模式试图解决这些问题.应用程序可以拆分为可管理的且按功能划分的组

Docker生态系统系列之三:服务发现和分布式配置存储

本文讲的是Docker生态系统系列之三:服务发现和分布式配置存储,[编者的话]本文介绍了服务发现与全局可读配置存储两部分内容,不仅介绍了工作原理和工作方式,也介绍了与之相关的故障检测.重配置和安全问题,最后还介绍了常用的服务发现项目.整篇文章将这个知识点介绍的很全面细致,让读者能够对服务发现和全局可读配置存储有一个全面的认识,值得学习. 介绍 容器给寻找大规模设计与部署应用的需求提供了一个优雅的解决方案.在Docker提供实际容器技术的同时,许多其他的项目也在协助开发在部署环境中所需要的引导和沟

DockerCon 2016 深度解读:在阿里云上体验Docker 1.12内置的编排能力

昨天才从DockerCon大会归来,阿里云容器服务团队将为大家奉献一系列深入学习的文章来帮助大家了解Docker 1.12的最新动态. 第一部分:在阿里云上体验Docker 1.12内置的编排能力 (本文) 第二部分:在阿里云上体验Docker 1.12的路由能力和容器应用分发部署 在DockerCon第一天的Keynote里面,Docker CTO Solomon Hykes宣布Docker将提供内置的编排(Orchestration)能力,从而能使得Docker Engine原生支持集群管理

Docker生态系统一览

本文讲的是Docker生态系统一览,[编者的话]本文旨在介绍当前可用的Docker生态系统存在哪些部分,包括:Docker Hub.Docker Engine.Kitematic.Docker Machine.Swarm.Docker Compose.Dokcer Cloud以及Data Center,文章会详细介绍这些工具的功能,以及怎样能够更好地将这些工具结合起来. 在过去的18个月内参加任何技术相关的活动或者阅读任何技术相关的文章时,你可能已经听说过Docker并且对Docker是什么以及

Docker Workflow(三):编排工具

本文讲的是Docker Workflow(三):编排工具,[编者的话]要在生产环境中发挥Docker的威力,离不开编排工具的支持,否则将深陷容器监控与管理困难的泥沼.目前市面上有不少此类工具,如何选择最合适的一个,本文给出了一些参考. 这是关于我们如何在IIIEPE的生产环境中使用Docker的系列文章的第三部分.如果你还没看过第一(译文)和第二(译文)部分,请先前往阅读再继续.本文中,我将讨论我们测试过的编排工具,我们的选择及原因.我也会说明我们如何使用Jenkins来处理繁重的工作,以及它的

《自己动手写Docker》书摘之五: 增加容器资源限制

增加容器资源限制 上一节中,我们已经可以通过命令行mydocker run -ti的方式创建并启动容器,这一节我们将通过Cgroup对容器的资源进行控制. 这一节中我们将实现通过mydocker run -ti -m 100m -cpuset 1 -cpushare 512 /bin/sh的方式控制容器容器的内存和CPU配置. 定义Cgroups的数据结构 上一章中我们介绍了Cgroups包含的三个概念:  cgroup hierarchy中的节点,用于管理进程和subsystem的控制的关系.

[Docker入门系列教程] 目录索引

  Docker是一个开源平台,使开发者和系统管理员可以构建.发布和运行分布式应用.Docker包括Docker引擎.可移植的轻量级运行环境和打包工具,Docker Hub提供了分享应用和自动化工作流的云服务,Docker可以使应用由多个组件快速装配起来,消除了开发.测试和生产环境的差异.因此,应用可以更快地发布,可以运行在本地.数据中心虚拟设备和任何云端,无需更改任何配置.  下面是我之前写的Docker入门系列文章的目录索引,感兴趣的朋友可以点击文章链接查看.   [Docker系列·0]

使用 docker+tmux 加强容器调度

使用 docker+tmux 加强容器调度 摘要 为了让自己做事更加自动化,把重复的工作尽可能降到最低,平时不但需要写很多固定操作的脚本来加快工作效率. 搞搞调度环境也是需要的. 本篇通过Docker+Tmux在RancherOS上做开发平台来实现最快速的Docker调度方便自己开发. 可以最快速度进入到调度容器中. 该容器有docker deamon 的所有控制权限. 可以在容器内的Tmux中跳转到其他容器中.方便调度开发. 经过2个版本的迭代终于搞定.到达1.0版本 Docker Regis