Docker学习(21)——Docker 三剑客之 Docker Swarm集群(手动搭建、拉伸、缩减、集群监控、global模式、滚动更新服务)

倾然丶 夕夏残阳落幕 提交于 2019-11-26 17:50:34

1.基本概念

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目
但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具
而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具
我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了
使用docker-compose部署集群实现负载均衡的时候,我们使在一台主机上面做的,不可以动态的拉神web服务的数量
因为使用docker-compose不满足实际生产环境的要求,因此不需要使用docker-compose了
实际当中我们的web(rs)服务器是要随着业务的增加而增加的
因此使用daoker内置的swarm集群来实现
swarm要求docker-compose必须v3版本以上
swarm自带docker stack会替代docker-compose
其实docker-machine+docker-swarm,就可以实现自动部署docker和自动实现各种功能

2.Docker swarm的好处

可以实现:负载均衡,高可用(服务的自动迁移)动态拉神与压缩web服务器的数量 
每一个节点都会拉起容器,而且都是调度器
但是监控只能在server1这个管理节点上面做
Docker Machine 创建 Docker 主机
Docker Swarm 配置集群节点
Docker Service 部署单个集群服务
Docker Stack 部署多个集群服务,以及 GUI 管理页面

docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令要知道

3.搭建实验环境

3台rhel7.3版本的虚拟机
一共三台主机:server1 server2 server3
server1是主节点(leader节点\manager节点)

主机信息 主机功能
server1(172.25.2.1) swarm集群的主节点,自身同时也是一个worker节点
server2(172.25.2.2) swarm集群的worker节点1
server3(172.25.2.3) swarm集群的worker节点2

(1)使用真机连接server1、server2和server3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)从真机给三个节点都发送一个nginx镜像
在这里插入图片描述
在这里插入图片描述
首先三台机子都必须安装docker,均有nginx的镜像
这个我之前的实验已经做过,因此直接在上面做即可,不再演示安装docker服务的过程

(3)三个节点的docker服务已经安装好,并且实验环境干净

server1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
server2
在这里插入图片描述
在这里插入图片描述
server3
在这里插入图片描述
在这里插入图片描述

4. Docker Swarm 配置集群节点具体的实现过程(手动搭建swarm集群)

昨天做了docker-compose之后,发现不是很灵活,现在我们使用docker swarm来部署docker集群
不使用docker-compose了

(1)部署基本的swarm集群(Docker Service 部署单个集群服务,手动搭建)

自动实现集群部署、负载均衡、高可用

(1)在server1上面

server1是leader节点,因此在server1上面初始化集群
docker swarm init

在这里插入图片描述
(2)在server2上面

server2是worker节点,将server2也加入集群当中

在这里插入图片描述
(3)在server3上面

server3是worker节点,将server3也加入集群当中

在这里插入图片描述
(4)在server1上面

docker node ls集群已经创建好了
server1是管理节点,可以看到基本的swarm集群已经搭建成功

在这里插入图片描述
(5)在server1、server2、server3上面

导入nginx镜像
docker images
docker tag  nginx:1.16 nginx
docker images

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(6)在server1上面

准备部署使用容器部署nginx集群服务
docker service --help
docker service create --help

在这里插入图片描述
(7)在server1、server2、server3上面

集群部署好之后三个节点上面都会出现两个自动生成的网络

docker network ls

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(8)在server1上面

docker service create --name web --replicas 3 --publish 80:80 nginx
利用nginx镜像运行容器,运行三个web(副本),副本个数不限制,会平均分配给三个节点
docker service ls查看总的服务
docker service ps web查看每个web服务运行在哪个节点
docker ps查看容器的运行情况

在这里插入图片描述
在这里插入图片描述
可以看到3个web刚好负载均衡给了三个节点
在这里插入图片描述
可以看到运行了一个容器
在这里插入图片描述
(9)在server2上面

docker ps可以看到运行了一个容器

在这里插入图片描述
(10)在server3上面

docker ps可以看到运行了一个容器

在这里插入图片描述

因为有三个web副本,因此刚好三个节点各自运行一个容器
如果是六个副本,那么三个几点各自运行两个容器
其实也不完全是平均分配的
副本数量比较少的时候是平均分配的,副本数量大的时候会根据节点的资源情况分配

(11)测试

浏览器访问172.25.2.1发现负载均衡的效果不是很明显
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(12)在server1上面

docker ps
echo server1 > index.html
docker cp index.html id:/usr/share/nginx/html

在这里插入图片描述

(13)在server2上面

docker ps
echo server2 > index.html
docker cp index.html id:/usr/share/nginx/html

在这里插入图片描述

(14)在server3上面

docker ps
echo server3 > index.html
docker cp index.html id:/usr/share/nginx/html

在这里插入图片描述

(15)浏览器访问验证三个节点是否正常

172.25.2.1
172.25.2.2
172.25.2.3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(16)在真机上面验证负载均衡

for i in {1..10}; do curl http://172.25.2.1; done
for i in {1..10}; do curl http://172.25.2.2; done
for i in {1..10}; do curl http://172.25.2.3; done

在这里插入图片描述
在这里插入图片描述
总结:以上就实现了使用命令搭建swarm集群

(2)swarm集群中对运行web服务个数的拉伸

(1)在server1上面:拉伸副本的个数

docker service scale web=6由原来的三个变为六个
docker ps查看运行的容器个数,刚好两个web容器

在这里插入图片描述
(2)在server2上面

docker ps刚好两个web容器

在这里插入图片描述
(3)在server3上面

docker ps刚好两个web容器

在这里插入图片描述
(4)在真机上面

for i in {1..10}; do curl http://172.25.2.1; done
for i in {1..10}; do curl http://172.25.2.1; done
for i in {1..10}; do curl http://172.25.2.1; done
和刚才的相比,发现有默认发布页面,因为加入了新的web服务器

在这里插入图片描述
在这里插入图片描述
以上实现了基本的拉神,缩减也是这个道理

(3)实现利用监控页面监控集群中各个节点容器的运行情况(含缩减和拉伸)

利用图形监控更加直观形象

(1)从真机给server1拷贝一个监控镜像并且导入
注意:这个镜像只需要给管理节点(server1)即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)在server1上面拉起监控的这个容器

在server1上面:
docker load -i ...
docker images
docker service create \
  --name=viz \
  --publish=8080:8080/tcp \注意端口映射
  --constraint=node.role==manager \
  --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer

在这里插入图片描述
在这里插入图片描述
可以看到server1上面的监控容器正在运行

(3)直接在浏览器里面访问

172.25.2.1:8080
看到6个web服务运行的容器在三个节点上面,监控界面的容器运行在server1上
可以看出负载均衡、高可用、调度器、服务自动迁移

在这里插入图片描述

(4)在server1上面

docker servcie scale web=10拉神web服务的个数,其实就是增多容器的个数
free -m 可以查看一下三个节点的宿主机内存是否够用

在这里插入图片描述
(5)在浏览器里面进行查看
在这里插入图片描述
注意:不管为web的个数是多少,管理节点(自身也是worker节点)都会根据三个worker节点的资源使用情况合理分配
并不一定是平均分配的,这一点一定要注意,因此说实现了负载均衡、高可用等等
还有就是集群中的每个节点都应该有拉起容器的镜像,因为每个节点都有承担任务的可能性

(6)在server1上面

docker servcie scale web=5缩减web个数

在这里插入图片描述
可以看到server1上面运行了一个web容器
在这里插入图片描述
server2上运行了两个web容器
在这里插入图片描述
server3上也运行了两个web容器
在这里插入图片描述
(7)在浏览器里面查看
在这里插入图片描述
(8)同理:再次缩减为3个web并且查看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(9)在server3上面

systemctl stop docker
查看浏览器,发现server3出现问题,web会迁移,这就实现了高可用

在这里插入图片描述
在这里插入图片描述
(10)在server3上面

systemctl start docker
即使server3好了,服务也不会迁移回去
再次来新的web的时候他就会自动均衡给server3
查看浏览器

在这里插入图片描述
在这里插入图片描述
其实不论节点的个数是多少个,副本的个数不会被限制,而是负载均衡给集群当中所有的节点

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
再次压缩一下
在这里插入图片描述
在这里插入图片描述
这一点也体现了在负载均衡的时候哪个节点的性能好资源多,哪个节点就运行的容器多一点

(4)服务的滚动更新

查看一下命令的用法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拉神一下刚才web的个数
在这里插入图片描述
在浏览器里面查看
在这里插入图片描述
从真机给三个节点发送服务的镜像
在这里插入图片描述
给三个节点导入镜像并且查看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在server1上开始更新服务

更新策略:5s更新一次,一次更新两个

在这里插入图片描述
在这里插入图片描述
过一会在浏览里面查看,发现已经更新完毕,全部由nginx服务变为game2048服务

这10个容器本来运行的是nginx服务,现在运行的是game2048小游戏
可能就是刚才的10个容器已经释放,重新拉起来10个容器
注意:每个节点的镜像一定要到位

在这里插入图片描述
刷新,容器id一直在变化,这个更能看出负载均衡的效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在server1上查看一下10个web容器运行的情况
在这里插入图片描述
在server1管理节点上面删除原来的10个web服务,只留下监控服务
在这里插入图片描述
在这里插入图片描述
可以看出server2和server3上面的容器也会立马释放
在这里插入图片描述
在这里插入图片描述
滚动更新服务演示完毕

(5)swarm的global模式的部署

某些特殊的以用场景,比如说:大型集群当中要对每个节点进行zabbix监控
那么只需要给每个节点部署一个zabbix-agent容器即可,global也就是保证每个节点时刻有且只有一个容器

在server1上以global模式部署集群
这里不需要指定副本的个数,因为global模式默认在每个节点之运行一个容器
如果指定副本个数就会报错,不信你可以试一下
在这里插入图片描述
可以看到server1上只有一个web容器
在这里插入图片描述
可以看到server2上只有一个web容器
在这里插入图片描述
可以看到server3上只有一个web容器
在这里插入图片描述
在浏览器里面查看
在这里插入图片描述
如果集群当中自动加入一个节点,那么管理节点就会自动在刚进来的节点上面运行一个容器
接下来实现一下
在真机当中再开启一台server4
在这里插入图片描述
在这里插入图片描述
因为目前运行的服务是game2048,因此给server4一个镜像
在这里插入图片描述
在server4上安装docker
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
给server4导入镜像并且查看
在这里插入图片描述
将server4加入集群当中
在这里插入图片描述
在server1上查看
在这里插入图片描述
可以看到一共4个容器服务,有一个还没起来,就是server4上的那个
在这里插入图片描述
查看web服务的细节
在这里插入图片描述
再次查看,已经运行
在这里插入图片描述
浏览器里面查看,可以看到已经自动为server4添加web服务
在这里插入图片描述
在这里插入图片描述

补充:对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将server4设置为drain状态,也就是worker不再工作
这里缺少一张截图
在server1上查看各个节点的状态
在这里插入图片描述
在浏览器里面查看各个节点的状态
在这里插入图片描述
恢复server4为active状态
在这里插入图片描述
在这里插入图片描述

将server1设置为drain状态,server1上的worker容器会释放,但是监控的容器会正常工作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
验证合理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
恢复server1
在这里插入图片描述
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!