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

Docker SwarmKit 是 Docker 公司推出的一款用于容器集群管理和编排的开源项目。它通过内置的编排机制,使得容器应用可以广泛部署于大量设备中。本文介绍了 SwarmKit 的整体架构、试用体验及其与其他容器管理软件的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

一年一度的Docker盛会DockerCon终于圆满结束。在这短短的2天内,超过4000多名参会者包括开源社区的贡献者进行了激烈的思想碰撞。Docker再次迎来了举世瞩目的成就。Docker1.12引入了内置编排机制,其意义极为重大。在它的帮助下我们得以将容器从只能部署在单一机器之上,升级为能够将多种复杂的容器应用广泛部署于大量设备当中。Docker容器的集群管理,分布式应用在容器集群上的编排管理,一直是Docker想为用户解决的痛点之一。Docker1.12发布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之间转换。

主要特征:

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

    (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的下一个版本能带给我们更多的惊喜。

此篇文章曾经发布在博云的微信公账号上面,可以扫描下面二维码进行关注:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值