相关网站
- Docker官方Swarm(目录):https://docs.docker.com/swarm/
- Docker官方Swarm(概览):https://docs.docker.com/swarm/overview/
- 图形化容器visualizer:https://github.com/dockersamples/docker-swarm-visualizer
概念
- 容器编排:在现代开发当中,整体式的应用早已成为过去时,如今的应用由数十乃至数百个松散结合的容器式组件构成,而这些组件需要通过相互间的协同合作,才能使既定的应用按照设计运作。容器编排是指对单独组件和应用层的工作进行组织的流程。
- 容器编排工具:Docker swarm mode(Docker公司)、Kubernetes(google公司)和Mesos(Mesosphere公司)
- 单引擎(Single-Engine)模式:不包含在任何 Swarm集群 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式
- 集群swarm模式:通过使用命令
docker swarm init,将本机节点由单引擎模式切换为swarm集群模式。 - Docker提供了一个用于与Docker守护进程进行交互的API(称为Docker Engine API),以及Go和Python的SDK。 使用SDK,您可以快速轻松地构建和扩展Docker应用程序和解决方案。 如果Go或Python不适用于您,则可以直接使用Docker Engine API。
- 在Docker生态系统中一共有3种API,这三种API都是依照REST标准:
- Registry API:提供了与来存储Docker镜像的Docker Registry集成的功能。
- Docker Hub API:提供了与Docker HUB集成的功能
- Docker Remote API:提供与Docker守护进程进行集成的功能
- Docker Swarm API主要是兼容Docker Remote API。Swarm API和Docker Engine API之间的还是有些区别的
- Swarm是Docker公司在2014年12月初新发布的容器管理工具。和Swarm一起发布的Docker管理工具还有Machine以及Compose。
- Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,并且还处于一个Alpha版本,目前在github上发布的版本 仅有v0.1.0-rc1。然而Swarm的发展十分快速,功能和特性的变更迭代还非常频繁。因此,可以说Swarm还不推荐被用于生产环境中,但可以肯 定的是Swarm是一项很有前途的技术。
- Swarm 安全机制:集群内置有繁多的安全机制,提供了开箱即用的合理的默认配置——如 CA 设置、接入 Token、公用 TLS、加密集群存储、加密网络、加密节点 ID 等。
swarm架构

-
swarm 集群相关概念:
- 节点:【node】:管理节点(manager)和工作节点(worker)构成
- mananger:管理节点(manager)负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。同时负责接收来自docker client的命令反馈至woker中进行运行,同时负责节点与仓库进行镜像拉取,使用Docker swarm API进行交互,并且在创建集群时,Swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群
- Discovery 模块:Swarm发现Docker集群中的节点。discovery是Swarm中用于维护Docker集群状态的机制。既然涉及到 发现节点(但是在发现之前必须先有注册(register))。Swarm中有专门负责发现(discovery)的模块,而关于注册 (register)部分,不同的discovery模式下,注册(register)也会有不同的形式。目前,Swarm中提供了5种不同的发现(discovery)机制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery
- Scheduler 模块:Swarm内部的调度模块,在被初始化后面,swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,一旦Swarm接收到具体的Docker管理请求,Swarm需要对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选(filter)决策到底哪些Docker Node满足要求,并通过一定的策略(strategy)将请求转发至具体的一个Docker Node
- Swarm API模块:Swarm创建并初始化API监听服务模块后。从功能的角度来讲,可以将该模块抽象为Swarm Server。需要说明的是:虽然Swarm Server完全兼容Docker的API,但是有不少Docker的命令目前是不支持的,毕竟管理Docker集群与管理单独的Docker会有一些区 别。当Swarm Server被初始化并完成监听之后,用户即可以通过Docker Client向Swarm发送Docker集群的管理请求
- worker:工作节点,即图中的swarm node,负责使用docker守护进程管理多个容器,负责运行相应的服务来执行任务(task)。
- mananger:管理节点(manager)负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。同时负责接收来自docker client的命令反馈至woker中进行运行,同时负责节点与仓库进行镜像拉取,使用Docker swarm API进行交互,并且在创建集群时,Swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群
- 任务:【task】是swarm集群中的最小调度单位,在swarm集群中就是一个单一容器。
- 服务:【service】,是一组任务的集合,定义了任务的属性
- 服务模式:复制(replicated) 和 全局(global)
- replicated:复制模式,是服务的默认模式,这种模式会部署期望数量(Replicas参数)的服务副本,并尽可能均匀地将各个副本分布在整个集群中
- global:全局模式,在这种模式下,每个节点上仅运行一个副本
- 服务特性:扩容,缩容,针对的是复制模式下,部署数量的增多和减少
- 服务其他功能:升级镜像与回滚镜像
这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。

- 服务模式:复制(replicated) 和 全局(global)
- 节点:【node】:管理节点(manager)和工作节点(worker)构成
-
swarm 流程:
- 初始化 Swarm第一个管理节点
- -> 加入额外的管理节点
- -> 加入工作节点
- -> 完成
- -> 加入工作节点
- -> 加入额外的管理节点
- 初始化 Swarm第一个管理节点
-
swarm 管理节点高可用:
- swarm内置HA:Swarm 实现了一种主从方式的多管理节点的 HA。管理节点可能有多个,但是仅有一个节点处于活动状态
- Raft 算法:Swarm 使用了 Raft 共识算法的一种具体实现来支持管理节点的HA,部署管理节点应为奇数个,防止脑裂现象,同时建议不要部署太多管理节点(3-5为最佳)
- 主节点:【leader】:通常处于活动状态的管理节点被称为“主节点”(leader),而主节点也是唯一一个会对 Swarm 发送控制命令的节点。也就是说,只有主节点才会变更配置,或发送任务到工作节点
- 从节点:【follower】通常处于非活动状态的管理节点被称为“从节点”(follower),如果一个备用(非活动)管理节点接收到了 Swarm 命令,则它会将其转发给主节点
实践
实践环境
| 主机 | IP | 作用 |
|---|---|---|
| node1 | 192.168.27.11 | 安装有Docker(18.09.6) |
| node2 | 192.168.27.12 | 安装有Docker(18.09.6) |
| node3 | 192.168.27.13 | 安装有Docker(18.09.6) |
实践目的
通过swarm实现一个集群,拉伸,缩减节点,更新服务内容,并且在主控节点安装一个图像监控visualizer容器
实践过程
部署集群
- 由于本次实践,没有配置仓库,无法下载镜像,所以提前在node1、node2、node3中安装镜像ngnix,game2048,在node1中安装visualizer
[root@node1 images]# docker load -i ngnix.tar
[root@node1 images]# docker load -i game2048.tar
[root@node1 images]# docker load -i visualizer.tar
[root@node2 images]# docker load -i ngnix.tar
[root@node2 images]# docker load -i game2048.tar
[root@node3 images]# docker load -i ngnix.tar
[root@node3 images]# docker load -i game2048.tar
- swarm配置集群
- 创建集群,node1为manager身份
[root@node1 ~]# docker swarm init Swarm initialized: current node (v4xx2txjkdysv6ke783820tcd) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377 #以woork身份加入集群的命令,在其他需要加入集群的节点执行此命即可 To add a manager to this swarm, run 'docker swarm join-token manager' andfollow the instructions. #开启swarm集群,node1为管理节点,上面提示中给出了join woker的方式,如果要以manager身份加入集群,查看join-token,命令docker swarm join-token manager- node2与node3节点加入集群,以worker身份
[root@node2 ~]# docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377 This node joined a swarm as a worker. [root@node3 ~]# docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377 This node joined a swarm as a worker.- 查看集群信息
[root@node1 images]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION v4xx2txjkdysv6ke783820tcd * node1 Ready Active Leader 18.09.6 mv238rores67ue8bc3nocfb6h node2 Ready Active 18.09.6 iiu8b0tw4bzsf848smjrc7r6c node3 Ready Active 18.09.6 - swarm配置服务
[root@node1 images]# docker service create -p 80:80 --replicas 3 --name web_cluster nginx
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.
#因为没有使用仓库,报错提示,不影响试验
sb8uuq2ekxghlv8qzlg5csm0j
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
#服务建立过程
[root@node1 images]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
sb8uuq2ekxgh web_cluster replicated 3/3 nginx:latest *:80->80/tcp
#查服务是否建立
[root@node1 images]# docker service ps web_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qz72v7tujl8r web_cluster.1 nginx:latest node3 Running Running less than a second ago
xa75noxnlsqt web_cluster.2 nginx:latest node1 Running Running 42 seconds ago
ytdr9mg6nu5n web_cluster.3 nginx:latest node2 Running Running 44 seconds ago
#查看建立的服务web_cluster,中具体的task任务分布情况
- 修改各节点容器ngnix的访问页面,进行测试
容器是自动生成的,所以命名随机,需要查看,才能修改容器内容
[root@node1 images]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
f0870e291b8c nginx:latest "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes 80/tcp
#查看容器ID
[root@node1 images]# echo node1 > index.html
[root@node1 images]# docker cp index.html
f0870e291b8c :/usr/share/nginx/html/index.html
#修改index内容
[root@node2 opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
999072a92b00 nginx:latest "nginx -g 'daemon of…" 15 minutes ago Up 14 minutes 80/tcp
#查看容器ID
[root@node2 opt]# echo node2 > index.html
[root@node2 opt]# docker cp index.html 999072a92b00:/usr/share/nginx/html/index.html
#修改index内容
[root@node3 opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
a0be23d3551a nginx:latest "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 80/tcpluster.1.qz72v7tujl8r11dzebb7i0ccc
#查看容器ID
[root@node3 opt]# echo node3 > index.html
[root@node3 opt]# docker cp index.html a0be23d3551a:/usr/share/nginx/html/index.html
#修改index内容
- 进行测试,因为swarm是分布式的,访问任意几点,均可以实现web功能,所以分别针对node1、node2、node3的地址进行访问
[root@node1 images]# for i in {1..10};do curl 192.168.27.11;done
node2
node3
node1
node2
node3
node1
node2
node3
node1
node2
[root@node1 images]# for i in {1..10};do curl 192.168.27.12;done
node3
node1
node2
node3
node1
node2
node3
node1
node2
node3
[root@node1 images]# for i in {1..10};do curl 192.168.27.13;done
node1
node2
node3
node1
node2
node3
node1
node2
node3
node1
集群的容器的数量拉伸、缩减
[root@node1 images]# docker service scale web_cluster=6
web_cluster scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
[root@node1 images]# docker service ps web_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qz72v7tujl8r web_cluster.1 nginx:latest node3 Running Running less than a second ago
x9jpdjbdq5r7 web_cluster.2 nginx:latest node1 Running Running 10 minutes ago
ytdr9mg6nu5n web_cluster.3 nginx:latest node2 Running Running 13 minutes ago
u1j1romoes7c web_cluster.4 nginx:latest node1 Running Running 8seconds ago
jy78pio77yoe web_cluster.5 nginx:latest node3 Running Running less than a second ago
1rpve5ncf7l9 web_cluster.6 nginx:latest node2 Running Running 9seconds ago
[root@node1 images]# docker service scale web_cluster=4
web_cluster scaled to 4
overall progress: 4 out of 4 tasks
1/4: running
2/4: running
3/4: running
4/4: running
verify: Service converged
[root@node1 images]# docker service ps web_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qz72v7tujl8r web_cluster.1 nginx:latest node3 Running Running less than a second ago
x9jpdjbdq5r7 web_cluster.2 nginx:latest node1 Running Running 12 minutes ago
ytdr9mg6nu5n web_cluster.3 nginx:latest node2 Running Running 14 minutes ago
u1j1romoes7c web_cluster.4 nginx:latest node1 Running Running about a minute ago
安装图形化容器visualizer
- 根据官网指示,下载安装包,根据给定代码安装服务
[root@node1 images]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.nager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
image dockersamples/visualizer:latest could not be accessed on a registry to record
its digest. Each node will access dockersamples/visualizer:latest independently,
possibly leading to different nodes running different
versions of the image.
uusdr62myrnopa7zf44io3obp
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
[root@node1 images]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
uusdr62myrno viz replicated 1/1 dockersamples/visualizer:latest *:8080->8080/tcp
sb8uuq2ekxgh web_cluster replicated 9/9 nginx:latest *:80->80/tcp
#服务显示,viz创建
[root@node1 images]# docker service ps viz
ID NAME IMAGE NODE DESIRED CURRENT STATE ERROR PORTS
bupr51oo05yn viz.1 dockersamples/visualizer:latest node1 Running Running 2 minutes ago
#服务具体任务
- 开启了9个容器,显示效果如下

- 停止容器node3的docker服务,容器数量仍然为9个,从node3漂移到了node1和node2上了

- 重启服务,容器并不回回切到nodn3上

服务中容器更新镜像
- 为了测试明显,本次更新由原来的ngnix更新为game2048镜像
由于没有配置仓库,镜像需要安装在node1、node2、node3每一个节点上 - 进行更新
[root@node1 images]# docker service update --image game2048 --update-delay 5s --update-parallelism 5 web_cluster
#docker service update 更新命令
#--image 更新镜像
#--update-parallelism 5 每次更新容器并行运行的数量,本次设置为5个,也就是每一批更新5个
#--update-delay 5s 每批次更新容器之间的时间间隔,本次设置为5秒
image game2048:latest could not be accessed on a registry to record
its digest. Each node will access game2048:latest independently,
possibly leading to different nodes running different
versions of the image.
web_cluster
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged
- 图像显示更新完成

- 更新完成访问game2048,效果达成。

容器镜像回滚
- 由game2048回滚到之前的ngnix
[root@node1 images]# docker service update --image nginx --rollback-parallelism 3 --rollback-delay 2s web_cluster
#docker service update 回滚也属于更新命令下的选项
#--rollback-parallelism 每一批回滚容器的个数,与更新一样
#--rollback-delay 每批次回滚容器之间的时间间隔,与更新一样
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.
web_cluster
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged
- 回滚成功显示

- 回滚结果测试


本文介绍Docker Swarm的架构与概念,演示如何搭建Swarm集群,包括节点的拉伸与缩减,服务更新与回滚,以及安装图形化容器监控工具。深入探讨Swarm的管理与工作节点,服务模式,以及高可用机制。
859

被折叠的 条评论
为什么被折叠?



