工程师SwarmKit初体验 比传统集群工具更方便
分类:博云动态 发布时间:2017/3/21 0:00:00

    Docker在6月7日发布了SwarmKit,随后在上周的DockerCon大会中发布Docker1.12版本,宣布SwarmKit引入编排功能,终于为用户解决容器的集群管理、分布式应用在容器集群上的编排管理的两大难点。

  在SwarmKit的帮助下,我们得以将容器从只能部署在单一机器之上,升级为能够将多种复杂的容器应用广泛部署于大量设备当中。通过SwarmKit项目,使原生Docker Native即支持集群与分布式应用系统编排。

  接下来我会从SwarmKit的整体架构、试用体验以及与其他容器管理软件整体上的比较,这三个方面进行分享。


  “SwarmKit功能介绍”

  SwarmKit项目是Docker公司的一个开源项目,主要用来提供容器集群以及编排能力。其主要功能包括节点发现、基于raft算法的一致性和任务调度等。

  如下图所示,SwarmKit通过Containerd类似的方式接入Docker Engine,最终通过新的Docker API对外提供容器集群服务。


  整体架构



  通过这个架构图我们可以很清晰的看到SwarmKit中的Manager对其下的Worker节点信息基于Raft算法实现了数据一致,从而保证了一个Manager节点宕机以后并不影响整个集群的服务,实现了集群的高可用特性。


  目前来说SwarmKit还没有对外发布对于集群操作的API。但是,通过CLI的方式来进行集群的相关管理操作也是非常的简单。比如,通过在服务器上运行SwarmKit工具的swarmd命令后,即可将其加入到服务器集群中,是该服务器成为集群中的一个节点。


  SwarmKit的节点分为两类:

  工作节点(Worker):负责通过执行器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor)。

  (1)内建分布式存储,不要额外的数据库

  (2)支持Rolling update

  (3)容器高可用,支持Zero applicaton downtime

  (4)通过TLS保证了节点之间通讯的安全

  管理节点(Manager):负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户可以动态调整节点的角色,即在Manager和Worker之间转换。


  主要特征

  服务状态一致性

  SwarmKit会不断对比Worker节点的2个状态:期望状态和实际状态。当一个节点的这两种状态不一致时,SwarmKit会自动将服务中的任务调度到其他节点,以保证服务的正常运行。


  服务类型

  目前SwarmKit支持两种服务类型:

  复制服务:SwarmKit通过命令行参数可以在Worker节点上启动期望数量的服务实例,并通过调度策略合理地运行在不同的节点上。

  全局服务:SwarmKit会在集群中所有可用节点上启动一个任务。


  配置更新

  用户可以在任何时间对服务的一个或者多个配置进行更新,甚至更新整个服务的版本。在对某个服务执行完配置更新的命令后,SwarmKit会协调升级服务中的所有任务。默认策略是多个任务同时升级。现有的更新策略有:并发更新和延迟更新。

  并发更新:定义同时更新的任务数量,根据不同任务更新的实际结果来修正更新任务的最终状态,达到状态的一致。

  延迟更新:设置一组更新完成之后的最小等待时间。当配置升级时,SwarmKit会重启并等待任务变为运行状态,并在延迟结束后继续执行后续的更新。


  重启策略

  用户可以定制重启的条件、延迟和最大尝试次数。SwarmKit会检测任务状态,并按照用户定义的条件进行重启,同时SwarmKit会决定是否在不同节点启动任务,避免失效节点对服务产生影响。


  内置路由机制

  负载均衡对大规模集群来说是非常重要的,SwarmKit的结合使得Docker Engine自身支持路由功能,而与原生ovelay网络的结合,效果更加显著。容器原生的负载均衡,无需额外的集群设置,就可以兼容用户现有的负载均衡服务。通过IPVS与内核联合,实现可靠的负载均衡。


  集群管理

  SwarmKit的集群管理主要有以下特点:

  (1)状态存储:SwarmKit基于Raft算法在内存中维护集群的状态一致性,并能够在集群状态发生异常时迅速作出调度调整;

  (2)拓扑管理:SwarmKit支持通过API或者命令行方式来动态修改节点角色(Worker/Manager);

  (3)节点管理:操作者可以修改可用节点的状态。例如可以设置节点状态为Paused,以避免在该节点上创建新的任务;或者设置为Drained状态,除了禁止创建新任务外,当前节点上的其他任务也会被调度到其他节点上。


  任务调度

  SwarmKit在任务调度上主要有以下特点:

  (1) 资源感知:SwarmKit能够感知可用节点上的资源利用情况,并以此分配和执行任务。

  (2)资源约束:用户可以通过约束表达式,将任务调度到符合表达式的节点上。对节点的约束条件包括节点ID、名称和标签等。

  (3)调度策略:目前SwarmKit默认采用Spread调度策略;在满足约束条件和资源需求的前提下,尽可能地将任务调度到负载最低的节点。


  安全设计

  SwarmKit在安全设计方面有以下特点:

  (1)所有节点采用TLS相互通信。新的节点通过Swarm管理节点进行认证加入进来。

  (2)加入策略:节点加入集群可以通过自动允许、手动允许或者通过一个密钥来加入集群。

  (3)循环认证:TLS循环认证和重新加载在每个节点上都是透明的,用户可以设置循环认证和重新加载的频率(默认是3个月,最低是30分钟)。

  “SwarmKit初体验”


  二进制文件构建

  SwarmKit在安全设计方面有以下特点:

  (1)所有节点采用TLS相互通信。新的节点通过Swarm管理节点进行认证加入进来。

  (2)加入策略:节点加入集群可以通过自动允许、手动允许或者通过一个密钥来加入集群。

  (3)循环认证:TLS循环认证和重新加载在每个节点上都是透明的,用户可以设置循环认证和重新加载的频率(默认是3个月,最低是30分钟)。

  

    1环境搭建

  SwarmKit的源码在Github上,采用Go语言开发,所以要构建二进制文件,必须搭建Go开发环境。这里要求Go开发环境必须是1.6及以上版本。

  首先在https://golang.org/网站下载go1.6.2.linux-amd64.tar.gz,并解压到/usr/local下面。

  配置环境变量:

  GOROOT是Go的安装目录;GOPATH是开发者存放Go代码的目录。


  配置好环境变量后,在终端输入Go,出现如下界面说明安装成功:

  2源码下载和构建

  如果机器安装了Git,直接输入如下命令进行构建:

  $ go get github.com/docker/swarmkit/...

  如果没有安装git,在github上下载SwarmKit源码,并在自己的work目录下面创建/src/github.com/docker/目录,把SwarmKit源码放在这个目录下,执行以下命令构建:

  $ make binaries

  构建完成之后就会在bin目录下面产生如下的四个二进制文件:


  swarmd是一个swarmkit daemon程序,用来运行manager和worker。swarmctl是一个命令行工具,用来访问swarm manger,当然最终在Docker1.12可通过Docker命令访问。


  “SwarmKit具体使用”

  拷贝这4个文件分别到我们将要运行SwarmKit的三台主机的/usr/bin下面。

  (1)使用SwarmKit

  这里选择三台主机运行SwarnKit,依次为:

  192.168.1.220   Manager

  192.168.1.221   Worker

  192.168.1.222   Worker

  在执行命令之前确保/tmp下面不存在node-N

  在Manager节点执行如下命令:

  $ swarmd -d /tmp/node-1 --listen-control-api /tmp/manager1/swarm.sock --hostname node-1

  需要后台运行采用nohup启动。如果出现无法执行二进制文件,说明构建二进制文件机器的环境和启动swarmd的机器不一样,需要按照不同的环境重新构建。

  依次在Worker节点上执行如下命令:

  $ swarmd -d /tmp/node-2 --hostname node-2 --join-addr 192.168.1.220:4242

  $ swarmd -d /tmp/node-3 --hostname node-3 --join-addr 192.168.1.220:4242

  如果以上命令都执行成功,下面就可以在管理节点的终端执行swarmctl命令,来管理整个docker集群。
$ export SWARM_SOCKET=/tmp/manager1/swarm.sock

  查看节点信息:

  $ swarmctl node ls

  创建服务:

  $ swarmctl service create --name redis --image redis:3.0.5

  列出服务:

  $ swarmctl service ls

  检查服务:

  $ swarmctl service inspect redis


  这里看到了redis服务在node-1上面运行,这时就可以采用docker ps在node-1服务器上看到运行的redis容器。


  更新服务:

  $ swarmctl service update redis --replicas 3


  这就是SwarmKit的复制服务。这里看到了在3各节点分别运行了redis,这时可以分别在不同机器上通过docker ps命令查看正在运行的容器。node-2节点的Last State是PREPARING,说明此时node-2还没有启动redis容器。这里和docker一样,启动一个容器,如果本地没有这个容器的镜像,需要在docker hub上拉取镜像,当拉取完成后,容器将正常启动,最新的状态也会更新为RUNNING。


  更新redis:

  $ swarmctl service update redis --image redis:3.0.6


  这就是SwarmKit的配置升级。这里是以任务的方式执行的,Last State在容器最终更新完成后变成RUNNING。


  节点管理:

  这里我们使node-1进入不可用状态,查看节点的变化情况:

  $ swarmctl node drain node-1

  这时任务已经被迁移到node-2和node-3节点上,成功完成了任务的迁移,保证了SwarmKit服务的一致。


  使用体验

  通过以上对SwarmKit的使用,让我们明显的感觉到了SwarmKit的优势。SwarmKit是容器集群领域的新成果,直接集成在Docker Engine中,通过新的Docker API提供集群服务,相比于传统的集群管理工具更加方便。

  到目前为止,我们更多的是采用Swarm、Mesos或者Kubernetes支持大规模的生产基础设施,从而实现容器管理。而SwarmKit给我们带了新的选择,我们需要进一步的扩展以支持其他环境。

  当前SwarmKit还处于一个初步发展阶段,与Swarm、Kubernetes和Mesos相比,在调度方案上还远不能及,期待SwarmKit的下一个版本能带给我们更多的惊喜。

体验创新云技术带来核心业务效率显著提升
立即预约,加速企业数字化转型进程
Copyright ⓒ 2022 苏州博纳讯动软件有限公司 国徽 苏ICP备13004761号 法律声明及隐私政策