创建swarm集群并自动编排
1、基础环境配置
主机名 master node1 node2
IP地址 192.168.***.1 192.168.***.2 192.168.***.3
角色 管理节点 工作节点 工作节点
2、修改主机名
2.1 管理节点
1 [root@localhost ~]# hostnamectl set-hostname master
2 [root@localhost ~]# bash
3 [root@master ~]#
2.2 工作节点
1 [root@localhost ~]# hostnamectl set-hostname node1
2 [root@localhost ~]# bash
3 [root@node1 ~]#
2.3 工作节点
1 [root@localhost ~]# hostnamectl set-hostname node2
2 [root@localhost ~]# bash
3 [root@node2 ~]#
3、在master、node1和node2主机上均需正确安装docker并配置镜像加速器
请点击:安装Docker - H_one - 博客园 (cnblogs.com)
4、设置时间同步
1 [root@master ~]# ntpdate 0.centos.pool.ntp.org
2 [root@node1 ~]# ntpdate 0.centos.pool.ntp.org
3 [root@node2 ~]# ntpdate 0.centos.pool.ntp.org
5、在master节点上编辑docker.service文件,修改如下参数信息,并启动docker服务
1 [root@master ~]# vim /lib/systemd/system/docker.service
修改如下:
1 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2 [root@dmaster ~]# systemctl daemon-reload
3 [root@master ~]# systemctl restart docker
4 [root@master ~]# systemctl status docker
6、通过netstat -tunlp命令,可以查看到2375端口的信息,该端口默认为DockerHTTPAPI的端口
1 [root@master ~]# netstat -tunlp
7、在各主机节点上获取swarm镜像
1 [root@master ~]# docker pull swarm
2 [root@node1 ~]# docker pull swarm
3 [root@node2 ~]# docker pull swarm
8、创建集群
1 [root@master ~]# docker swarm init --advertise-addr 192.168.6.3
2 Swarm initialized: current node (zo03btaffpxok5wncx2wzzov9) is now a manager.
3
4 To add a worker to this swarm, run the following command:
5
6 docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
7
8 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
9、将node1和node2加入集群,在node1和node2节点上执行以下命令
1 [root@node1 ~]# docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
2 This node joined a swarm as a worker.
3 [root@node2 ~]# docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
4 This node joined a swarm as a worker.
在做这一步的时候我遇到了这样一个问题,它说来自守护程序的错误,意思就是我没有关闭防火墙所以导致如下错误。
[root@node2 ~]# docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 192.168.6.3:2377: connect: no route to host"
解决方法:
1 [root@node2 ~]# systemctl stop firewalld
2 [root@node2 ~]# systemctl disable firewalld
3 Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
4 Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
5 [root@node2 ~]# vi /etc/selinux/config
6 SELINUX=disabled
10、查看集群个节点的信息
1 [root@master ~]# docker node ls
2 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3 zo03btaffpxok5wncx2wzzov9 * master Ready Active Leader 20.10.14
4 kk7zblnmk9f57p2ynvd0yn8ca node1 Ready Active 20.10.14
5 ymfjjqococ8t6im8wlq4f1ws7 node2 Ready Active 20.10.14
# 若节点的status为up和down之间闪烁,原因,docker swarm 节点间通信默认超时时间为 5s,在虚拟化环境下或者网络不太好的情况下有时候会超时,导致节点重启。
# 解决方案,调高swarm心跳检测时间。
docker swarm update --dispatcher-heartbeat 60s #设置docker swarm的心跳检测时间为1分钟,在manages节点执行。
11、在swarm中部署服务,本任务以部署nginx服务为例进行介绍
1 [root@master ~]# docker pull nginx
2 [root@node1 ~]# docker pull nginx
3 [root@node2 ~]# docker pull nginx
12、在master节点中创建一个网络“nginx_net”,用于使不同的主机上的容器网络互通
1 [root@master ~]# docker network ls
2 NETWORK ID NAME DRIVER SCOPE
3 18c93bfdcbec bridge bridge local
4 2e947a5f0ac8 docker_gwbridge bridge local
5 5de49e00ddbc host host local
6 kye8igzym4vu ingress overlay swarm
7 s7fk3dqm1yty nginx_net overlay swarm
8 a5604f0fa6a0 none null local
13、在master节点上创建一个副本为1的nginx容器
1 [root@master ~]# docker service create --replicas 1 --network nginx_net --name my-test -p 9999:80 nginx
2 y87k6dc1wa9a39hq6grgitsob
3 overall progress: 1 out of 1 tasks
4 1/1: running [==================================================>]
5 verify: Service converged
6 [root@master ~]# docker service ls
7 ID NAME MODE REPLICAS IMAGE PORTS
8 y87k6dc1wa9a my-test replicated 1/1 nginx:latest *:9999->80/tcp
9 [root@master ~]# docker service inspect --pretty my-test 或 docker service inspect my-test # 两条命令其中一条
# 参数说明:
# --format, -f 使用给定的Go模板格式化输出
# --pretty 默认为false 以人性化的格式打印信息
14、使用docker service ps命令查询在哪个节点运行my-test容器
1 [root@master ~]# docker service ps my-test
2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3 kcyvzcqwtzcl my-test.1 nginx:latest master Running Running 51 seconds ago
15、伸缩容器,将my-test容器扩展到6个,在master节点上执行以下命令
1 [root@master ~]# docker service scale my-test=6
# 查看这6个服务运行在哪些节点上
2 [root@master ~]# docker service ps my-test
17、swarm可以缩容,如将my-test容器缩容为1个,代码如下
1 [root@master ~]# docker service scale my-test=1
2 # 将my-test容器缩容为1个后,利用docker service ps my-test命令进行查看,可以发现其它节点上的my-test容器状态为remove。
3 [root@master ~]# docker service ps my-test
18、节点宕机处理
# 如果一个节点出现了宕机情况,则该节点会从swarm集群中被移除,利用docker node ls命令进行查看,此时,在宕机节点上运行的容器会被调度到其他节点上,以满足指定数量的副本保持运行状态。
例如:在node2上把docker服务关闭,或者关机重启,在manage节点上查看swarm集群中各节点的状态。
1 [root@node2 ~]#
2 [root@node2 ~]# systemctl stop docker
3 Warning: Stopping docker.service, but it can still be activated by:
4 docker.socket
5 [root@node2 ~]# systemctl stop docker.socket
6 [root@node2 ~]# systemctl stop docker
7 [root@node2 ~]# systemctl status docker
# 需要等待一会儿,在master进行查看
1 [root@master ~]# docker node ls
2 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3 zo03btaffpxok5wncx2wzzov9 * master Ready Active Leader 20.10.14
4 kk7zblnmk9f57p2ynvd0yn8ca node1 Ready Active 20.10.14
5 ymfjjqococ8t6im8wlq4f1ws7 node2 Down Active 20.10.14
# 此时node2节点状态为down,node2节点上的容器被调度到其他节点上
1 [root@master ~]# docker service ps my-test
2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3 tdgpbytpu4ex my-test.1 nginx:latest master Running Running 4 minutes ago
4 kcyvzcqwtzcl \_ my-test.1 nginx:latest master Shutdown Complete 4 minutes ago
# 当node2节点重新启动docker服务后,node2节点原有的容器不会自动调度到node2节点上只能等到其他节点出现故障或手动终止容器后,再根据内部算法重新转移task实例到其他节点上
1 [root@master ~]# docker node ls
2 [root@master ~]# docker service ps my-test
18、在swarm中使用数据卷,在个主机节点上创建数据卷,数据卷名为volume-test。三台节点都要创建数据卷。
1 [root@master ~]# docker volume create --name volume-test
2 volume-test
3 [root@master ~]# docker volume ls
4 [root@master ~]# docker volume inspect volume-test
1 [root@node1 ~]# docker volume create --name volume-test
2 volume-test
3 [root@node1 ~]# docker volume ls
4 [root@node1 ~]# docker volume inspect volume-test
1 [root@node2 ~]# docker volume create --name volume-test
2 volume-test
3 [root@node2 ~]# docker volume ls
4 [root@node2 ~]# docker volume inspect volume-test
19、在各主机节点的/var/lib/docker/volumes/volume-test/_data目录中新增index.html文件。由于该目录建立的是本地卷,即在各主机节点上建立数据卷目录(如果采用网络存储,则可以直接挂载到_data目录中),因此,新增index.html文件时只需操作一次
1 [root@master ~]# cd /var/lib/docker/volumes/volume-test/_data
2 [root@master _data]# echo "this is nginx-test in master" > index.html
1 [root@node1 ~]# cd /var/lib/docker/volumes/volume-test/_data
2 [root@node1 _data]# echo "this is nginx-test in node1" > index.html
[root@node2 ~]# cd /var/lib/docker/volumes/volume-test/_data
[root@node2 _data]# echo "this is nginx-test in node1" > index.html
20、创建一个副本数为3的容器swarm-nginx,挂载volume-test到容器的/usr/share/nginx/html目录中,并映射端口
1 [root@master _data]# docker service create --replicas 3 --mount type=volume,src=volume-test,dst=/usr/share/nginx/html --name swarm-nginx -p 8001:80 nginx
2 bjpef3epus72i1uxikkmwy9l9
3 overall progress: 3 out of 3 tasks
4 1/3: running [==================================================>]
5 2/3: running [==================================================>]
6 3/3: running [==================================================>]
7 verify: Service converged
# docker service create --replicas 3 --mount type=volume,src=创建的volume名字,dst=容器内目录 --name 自定义名字 -p 80:80 容器名
# src=source dst=target
21、验证效果
1 [root@master _data]# for i in {1..10};do curl 192.168.6.3:8001;done
2 this is nginx-test in node2
3 this is nginx-test in master
4 this is nginx-test in node1
5 this is nginx-test in node2
6 this is nginx-test in master
7 this is nginx-test in node1
8 this is nginx-test in node2
9 this is nginx-test in master
10 this is nginx-test in node1
11 this is nginx-test in node2
# 至此,swarm的负载均衡功能已经启动完成。