返回 登录
0

工程师SwarmKit初体验 比传统集群工具更方便

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

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

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

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

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

整体架构
图片描述

目前来说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之间转换。

主要特征
(1)服务状态一致性: SwarmKit会不断对比Worker节点的2个状态:期望状态和实际状态。当一个节点的这两种状态不一致时,SwarmKit会自动将服务中的任务调度到其他节点,以保证服务的正常运行。
(2)服务类型:目前SwarmKit支持两种服务类型:
复制服务:SwarmKit通过命令行参数可以在Worker节点上启动期望数量的服务实例,并通过调度策略合理地运行在不同的节点上。
全局服务:SwarmKit会在集群中所有可用节点上启动一个任务。
(3)配置更新:用户可以在任何时间对服务的一个或者多个配置进行更新,甚至更新整个服务的版本。在对某个服务执行完配置更新的命令后,SwarmKit会协调升级服务中的所有任务。默认策略是多个任务同时升级。现有的更新策略有:并发更新和延迟更新。
并发更新:定义同时更新的任务数量,根据不同任务更新的实际结果来修正更新任务的最终状态,达到状态的一致。
延迟更新:设置一组更新完成之后的最小等待时间。当配置升级时,SwarmKit会重启并等待任务变为运行状态,并在延迟结束后继续执行后续的更新;
(4)重启策略:用户可以定制重启的条件、延迟和最大尝试次数。SwarmKit会检测任务状态,并按照用户定义的条件进行重启,同时SwarmKit会决定是否在不同节点启动任务,避免失效节点对服务产生影响。
(5)内置路由机制:负载均衡对大规模集群来说是非常重要的,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刚刚开源,没有稳定的二进制分发版,所以需要我们自行构建。构建过程非常简单,主要分为:环境搭建、源码下载和构建两个步骤。
环境搭建:SwarmKit的源码在Github上,采用Go语言开发,所以要构建二进制文件,必须搭建Go开发环境。这里要求Go开发环境必须是1.6及以上版本。
首先在https://golang.org/网站下载go1.6.2.linux-amd64.tar.gz,并解压到/usr/local下面。

配置环境变量
图片描述
GOROOT是Go的安装目录;GOPATH是开发者存放Go代码的目录。
配置好环境变量后,在终端输入Go,出现如下界面说明安装成功:
图片描述
源码下载和构建:
如果机器安装了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的下一个版本能带给我们更多的惊喜。

本文还在微信公众号发表http://mp.weixin.qq.com/s?__biz=MzIzNzA5NzM3Ng==&mid=2651856819&idx=1&sn=45c7a0ca414bee039afe02a0a1f9114a#rd

作者董凯,BoCloud博云 JAVA开发工程师

评论