Swarm介绍
Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,上周五,4月17号,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。下面是Swarm的结构图:
搭建swarm集群
实验环境
IP | 服务 | 备注 |
---|---|---|
192.168.1.10 Docker(已安装) | swarm-manage | |
192.168.1.20 Docker(已安装) | swarm node1 | |
192.168.1.30 Docker(已安装) | swarm node2 |
实验步骤
主机名更改
为了方便实验的进行,对每台主机进行更改主机名和hosts文件的编写 192.168.1.10
代码语言:javascript复制[root@localhost ~]# vim /etc/hosts
# 添加
192.168.1.10 swarm-manage
192.168.1.20 node1
192.168.1.30 node2
[root@localhost ~]# hostname swarm-manage
[root@localhost ~]# bash
[root@swarm-manage ~]#
192.168.1.20
代码语言:javascript复制[root@localhost ~]# hostname node1
[root@localhost ~]# bash
[root@node1 ~]#
192.168.1.30
代码语言:javascript复制[root@localhost ~]# hostname node1
[root@localhost ~]# bash
[root@node2 ~]#
免密登录
192.168.1.10
代码语言:javascript复制[root@swarm-manage ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:dVRC5qbjHlvEC/2YwOkMZddtz/tKvi5DHU9YYG9k7Tc root@localhost.localdomain
The key's randomart image is:
---[RSA 2048]----
| .=. . |
| =o|
| = . =|
| = O oE=|
| S B . =|
| = =.=. o|
| =.= o. |
| . oo .|
| o =o.|
----[SHA256]-----
[root@swarm-manage ~]# ssh-copy-id -i root@node1
[root@swarm-manage ~]# ssh-copy-id -i root@node2
[root@swarm-manage ~]# scp /etc/hosts/ root@node1:/etc/
[root@swarm-manage ~]# scp /etc/hosts/ root@node2:/etc
初始化swarm集群
默认情况下,当swarm集群初始化后,分配的swarm集群中的ip网段为10.0.0.0/8,如果想要去指定网段,也可以通过初始化时的命令进行指定。如下:
docker swarm init --default-addr-pool 10.20.0.0/16 --advertise-addr 192.168.1.10可以用来指定swarm集群使用的网段. –default-addr-pool-mask-length 26:加长子网掩码,在16为的基础上加长到26位 命令行选项default-addr-pool 10.10.0.0/16表示Docker将从/16地址范围分配子网。如果–default-addr-pool-mask-len未指定或显式设置为24,则会生成256个/24个网络,形式为10.10.X.0/24。
swarm manage(192.168.1.10)
指定集群管理节点为192.168.1.10
代码语言:javascript复制[root@swarm-manage ~]# docker swarm init --advertise-addr 192.168.1.10
Swarm initialized: current node (ocu03ojg1j4nawgkr2mvo7eij) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5xgjcrmf5c6i0fjyc73gz5t9rtg5r4g2zd28ajh81ts36lvdde-bsglhwea30jdkmddqi6ky0s23 192.168.1.10:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@swarm-manage ~]# docker info | grep Swarm
Swarm: active # 表示Swarm集群已经在运行了
初始化结束后,会有两条重要输出,第一条为如果要添加swarm node请在要加入集群的主机上执行docker swarm join --token SWMTKN-1-5xgjcrmf5c6i0fjyc73gz5t9rtg5r4g2zd28ajh81ts36lvdde-bsglhwea30jdkmddqi6ky0s23 192.168.1.10:2377 第二条为,如果要添加新的manage swarm,请在本机执行docker swarm join-token manager,然后会重新报出一个token,用于以manage的身份加入集群。
放行swarm集群端口
代码语言:javascript复制[root@swarm-manage ~]# firewall-cmd --add-port=2377/tcp
节点加入集群
node1(192.168.1.20)
代码语言:javascript复制[root@node1 ~]# docker swarm join --token SWMTKN-1-5xgjcrmf5c6i0fjyc73gz5t9rtg5r4g2zd28ajh81ts36lvdde-bsglhwea30jdkmddqi6ky0s23 192.168.1.10:2377
This node joined a swarm as a worker.
node2(192.168.1.30)
代码语言:javascript复制[root@node2 ~]# docker swarm join --token SWMTKN-1-5xgjcrmf5c6i0fjyc73gz5t9rtg5r4g2zd28ajh81ts36lvdde-bsglhwea30jdkmddqi6ky0s23 192.168.1.10:2377
This node joined a swarm as a worker.
swarm-manage(192.168.1.10)
查看集群节点,MANAGER显示的Leader就是集群的管理节点
代码语言:javascript复制[root@swarm-manage ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
c7kao8526ogi7v9vatzwprxr2 node1 Ready Active 20.10.2
mz35p4jafi44afxuytt1ab1m0 node2 Ready Active 20.10.2
ocu03ojg1j4nawgkr2mvo7eij * swarm-manage Ready Active Leader 20.10.2
删除集群节点
代码语言:javascript复制docker node rm 节点ID
节点提权
将node2主机提升为manager,我在提权后总遇到报错,只要一提权,这台节点状态就是DOWN,查看日志发现是因为没有该主机没有放行2377端口
代码语言:javascript复制[root@swarm-manage ~]# docker node promote node2
Node node2 promoted to a manager in the swarm.
查看集群节点,Reachable也表示manager节点
代码语言:javascript复制[root@swarm-manage ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
c7kao8526ogi7v9vatzwprxr2 node1 Ready Active 20.10.2
mz35p4jafi44afxuytt1ab1m0 node2 Ready Active Reachable 20.10.2
ocu03ojg1j4nawgkr2mvo7eij * swarm-manage Ready Active Leader 20.10.2
节点降权
将node2主机从manager降为worker
代码语言:javascript复制[root@swarm-manage ~]# docker node demote node2
查看管理节点
只要是在swarm集群中的主机都可以看到swamr的管理节点ip
代码语言:javascript复制[root@swarm-manage ~]# docker info
...
Node Address: 192.168.1.10
Manager Addresses:
192.168.1.10:2377
...
下载图形化显示工具的镜像
swarm-manage(192.168.1.10)
下载完成后,运行
代码语言:javascript复制[root@swarm-manage ~]# docker pull dockersamples/visualizer
[root@swarm-manage ~]# docker run -itd -p 8888:8080 -e HOST=192.168.1.11
-e PORT=8080 --volume /var/run/docker.sock:/var/run/docker.sock
--name visualizer --restart always dockersamples/visualizer
[root@swarm-manage ~]# firewall-cmd --add-port=8888/tcp
success
访问验证http://192.168.1.10:8888
如图所示,集群三个节点都是绿色状态
方便用来查看swarm集群运行后,那个容器副本运行在哪台主机节点上