概述
在我的Docker Swarm 集群初探 https://www.jianshu.com/p/3f3c9e0e3db5 一文中, 我们实际体验了 Docker Swarm 容器集群技术的魅力, 与Kubernetes 实践录 https://www.jianshu.com/p/9bc87b5380e8 一文中提到的 Kubernetes 集群技术相比, Docker Swarm 没有 Kubernetes 显得那么厚重, 因此可以认为是更加轻量级的容器集群技术, 这也就意味着上手更加方便快捷, 使用起来也要省事很多. 作为 Docker 集群技术三 (或 "四") 架马车之一的 Docker Swarm, 它从一开始便是 Docker 官方的 "亲儿子", 发展到现在也经历了很多阶段和迭代. 作者在学习的过程中也了解了一点其发展历史, 发现有几个概念还是挺容易混淆的, 因此撰写成文, 是梳理, 也是总结.
初出茅庐之: 经典 Swarm
早在 2014 年底, Docker 公司就设计了容器集群的方案组合: Machine + Swarm + Compose. 其中 Machine 主要用于快速创建 Docker 运行环境, 其支持在创建出来的节点上自动部署 Swarm, 此时的 Swarm 我们称为 "经典 Swarm", 它是一款整合跨节点网络的集群式容器服务, 其利用 Docker 守护进程的 API, 将多节点的计算资源进行汇总, 并提供兼容 Docker 的运行 API, 使用者只需要在执行 Docker 命令工具时, 用 --host 参数将目标设置为 Swarm 服务的 IP 和端口, 即可操作整个容器集群.
当然此时的 Swarm 局限性较大, 比如:
没有副本和负载均衡的概念, 这导致服务无法高可用
当然也更不存在什么服务网络管理和跨节点数据存储这些东西
没有服务模型: 集群中服务间关系和启动顺序编排也很复杂
于是就有了下面的 SwarmKit 的诞生.
发展壮大之: SwarmKit
在 2016 年 2 月, Docker 公司开始了一个名叫 SwarmKit 的项目. 而恰在 Docker 1.12 RC 之前的一段时间, Docker 发布了 Swarmkit, 这是一个独立的, 开源的容器编排项目. SwarmKit 不同于一开始的经典 Swarm, 它从一开始就重新设计了一套独立的 API 和模型体系, 并且采用独立的客户端命令行工具: swarmctl
和上面的经典 Swarm 模型相比, 它加入了如下特性:
重新设计的一套独立的 API 和模型体系
使用了自己的 CLI(swarmd 命令负责管理, swarmctl 命令用于控制)
节点管理, 服务模型更加自然, 提供编排和调度服务
将过去 Swarm 依赖的外部集群一致性存储组件 Etcd 的核心部分内置化
然而此时的 SwarmKit 并没有提供诸如服务发现, 负载均衡和路由等功能. 尽管如此, SwarmKit 其实已经是我们今天广泛使用的 Docker Swarm 集群技术的基石.
厚积薄发之: Swarm Mode
Swarm Mode 则更进一步, 它在 Docker 1.12 版本开始为大家所周知, 一个 docker swarm 命令 红遍大江南北, 这个所谓的 Swarm Mode 其实就是我们今天所广泛使用的 Docker Swarm 集群技术.
然而 Swarm Mode 并不是一个全新的东西, 也并不是一个全新的模式, 而是站在 SwarmKit 的巨人肩膀上发展起来的, 是 Docker 中的一组与集群相关功能的统称而已. Docker 将 SwarmKit 的核心模块内嵌于 Docker 的后台服务之中, 通过不同的命令允许使用者同时以 "本节点" 和 "本集群" 这两种视角来操作整个集群, 增加了集群的管理, 节点的管理, 服务的管理和编排等等一系列高级特性, 就像在我的Docker Swarm 集群初探 https://www.jianshu.com/p/3f3c9e0e3db5 一文中体验的那样.
因此总结一下 Swarm Mode 就是:
基于 Swarmkit 编写
支持服务模型以及服务发现, 路由和负载均衡等新功能
使用 Docker 原生态的 CLI 命令
集成到了 Docker engine 中(强大的 docker swarm 命令)
对比总结
如果用一张图来表示 Docker, 经典 Swarm,SwarmKit,Swarm Mode 四个概念之间的关系, 则大致可以如下图所示:
正如图中所示, SwarmKit 和 Swarm Mode 重叠的部分表示的是相应的项目之间存在代码层面的互相引用或组件形式的依赖, 其实 Swarm Mode 所创建的集群本质上并无异于 SwarmKit 集群.
更细致一点, 我们从 SwarmKit 和 Swarm Mode 二者在一些常用命令操作上的比较来看看二者的区别和联系:
1. 创建集群
SwarmKit 方式: swarmd
SwarmMode 方式: docker swarm init
2. 往集群中添加节点
SwarmKit 方式:
swarmd --hostname worknode --join-addr [IP: 端口] --join-token [Token]
SwarmMode 方式:
docker swarm join --token [token] [IP: 端口]
3. 查看集群节点信息
SwarmKit 方式: swarmctl node ls
SwarmMode 方式: docker node ls
4. 创建服务
SwarmKit 方式:
swarmctl service create --name [服务名] --image [镜像名]
SwarmMode 方式:
docker service create --name [服务名] [镜像名]
5. 服务扩容
SwarmKit 方式:
swarmctl service update [服务名] --replicas [副本数目]
SwarmMode 方式:
docker service scale [服务名]=[副本数目]
6. 服务 (镜像) 升级
SwarmKit 方式:
swarmctl service update [服务名] --image [镜像名]
SwarmMode 方式:
docker service update [服务名] --image [镜像名]
从命令行操作来看, Swarm Mode 其实非常类似于 SwarmKit, 然而前者更加靠近 Docker 原生态圈的命令, 因此更加人性化.
来源: https://yq.aliyun.com/articles/602876