docker-swarm集群

一、Swarm

Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

  • 工作原理

每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。

在集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。

管理者的管理对象不是服务器层面而是集群层面的,也就是说通过Manager,我们只能笼统地向集群发出指令而不能具体到某台具体的服务器上要干什 么(这也是Swarm的根本所在)。

至于具体的管理实现方式,Manager向外暴露了一个HTTP接口,外部用户通过这个HTTP接口来实现对集群的管 理。对于稍微大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。

  • 实验环境:

docker   18.03.1.ce

rhel7.3(

server1  172.25.25.11   manager
server2  172.25.25.12  worke
server3  172.25.25.13  worke
firewalld selinux 都关闭)

二、swarm部署

1.三台主机均安装docker

[[email protected] ~]# ls
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
[[email protected]erver1 ~]# yum install -y *
[[email protected] ~]# systemctl start docker

如果安装后无法使用tab 补全docker 命令,则可安装bash-*
 

2.swarm 集群的启动

  • 添加主节点

--advertise-addr参数的原因是大多数情况下我们的主机都不只有一张网卡。而一个swarm集群需要辨明集群所在的子网络是哪张网卡的
[[email protected] ~]# docker swarm init --advertise-addr=172.25.25.11

  • 命令运行成功的话会提示一串类似于被标蓝的信息:

docker-swarm集群

  • 在被管理主机上,只要运行这串命令就可以将该主机加入集群

[[email protected] ~]# docker swarm join --token SWMTKN-1-2eg6idqhwvzse6voqr1raqp008wiyejmnqx1x3te5wj2fsxzyd-1gie7jleafllxps6c9m7mvfwo 172.25.25.11:2377
This node joined a swarm as a worker.

[[email protected] ~]# docker swarm join --token SWMTKN-1-2eg6idqhwvzse6voqr1raqp008wiyejmnqx1x3te5wj2fsxzyd-1gie7jleafllxps6c9m7mvfwo 172.25.25.11:2377
This node joined a swarm as a worker.

  • 在manager上查看swarm各节点信息

[[email protected] ~]# docker node ls
docker-swarm集群

可以看出现在server1 为leader

我们得到了一个由三个节点组成的swarm小集群。在这个集群中有一个manager节点和三个worker节点(别忘了manager本身自动作为worker一员加入集群)。

到此swarm 集群搭建完成。由于swarm会自动地做一些如负载均衡,高可用,保持容器副本数量等工作,所以swarm对外提供的也是属于一个“服务”的概念。

三、搭建swarm 集群服务

1.首先给每个节点导入你所需服务的镜像

[[email protected] ~]# docker load -i nginx.tar
cdb3f9544e4c: Loading layer  58.44MB/58.44MB
a8c4aeeaa045: Loading layer  54.24MB/54.24MB
08d25fa0442e: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest

2.查看镜像信息

[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c82521676580        3 months ago        109MB
 

3.创建服务

[[email protected] ~]# docker service create --name web --replicas 3 --publish 80:80 nginx

  • 创建一个3个副本任务的服务(–replicas)  name参数指定的是服务的名字而非容器的名字,

docker-swarm集群

  • 在manager 节点上查看所添加的服务信息

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
lpykocwns7ff        web                 replicated          3/3                 nginx:latest        *:80->80/tcp

  • 在manager 节点上查看所添加的服务所有副本服务的信息

[[email protected] ~]# docker service  ps web
docker-swarm集群

4.搭建 swarm 自带监控(visualizer)

导入监控镜像并创建
[[email protected] ~]# docker load -i visualizer.tar
[[email protected] ~]# 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
在网页访问172.25.25.11:8080 查看是否设置成功(有监控界面)
docker-swarm集群

出现所创建的副本服务其状态则表示监控搭建成功

5.测试负载均衡

每个节点做以下操作

  • 写一个测试页面

[[email protected] ~]# vim index.html
server1

  • 查看镜像信息

[[email protected] ~]# docker ps
docker-swarm集群

  • 将写好的测试页放到公布目录下

[[email protected] ~]# docker cp  index.html  58adbaa61620:/usr/share/nginx/html/

  • 其他节点操作一致

[[email protected] ~]# vim index.html
server2
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5940fdc8d44c        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    80/tcp              web.1.siwg25p55aeatt0e6dtj0hmhl
[[email protected] ~]# docker cp index.html 5940fdc8d44c:/usr/share/nginx/html/

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c4321797b76a        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    80/tcp              web.2.yijffcfu7ll7rt33fnj6itae5
[[email protected] ~]# vim index.html
server3
[[email protected] ~]# docker cp index.html c4321797b76a:/usr/share/nginx/html/

  • 在物理机上测试:

docker-swarm集群

6.测试高可用(在监控中查看)

关闭任意一个节点(查看监控中的服务节点是否发生变化)
[[email protected] ~]# systemctl stop docker.service

docker-swarm集群
[[email protected] ~]# systemctl start docker.service

docker-swarm集群

节点恢复正常,但服务不会返回到之前的节点上

7.服务扩容测试高可用(自动)

可以将服务现有的replica为3的状态扩展到10,期间已经启动的容器不受影响。
[[email protected] ~]# docker service scale web=10

docker-swarm集群
在浏览器监控中查看有10个web

docker-swarm集群

8.自动更新服务

从私有仓库获取镜像(可以自己封装一个镜像放到私有仓库)或者如上面所示导入镜像
每个节点都做以下操作

1)先取得仓库认证 (westos.org 为仓库名)
[[email protected] ~]# docker login westos.org

Username: admin          
Password:
Login Succeeded

2)获取所需镜像

[[email protected] ~]# docker pull westos.org/rhel7:v2       
docker-swarm集群

3)在主节点做更新
[[email protected] ~]# docker service update --update-delay 5s --update-parallelism 5 --image westos.org/rhel7:v2 web

  • --image参数指定一个新镜像,那么该服务中的所有容器都会被更新成这个新镜像的内容。
  • 为了保证可用性,必然不能同时更新所有容器。swarm 内置了一个滚动更新的机制,可以让我们依次更新各个容器从而避免更新期间的不可用。
  • --upgrade-delay参数,表示更新服务对应的任务或一组任务之间的时间间隔。
  • 时间间隔用数字和时间单位表示,m 表示分,h 表示时,所以 10m30s 表示 10 分 30 秒的延时。
  • 另外--update-parallelism参数标志配置调度器每次同时更新的最大任务数量,默认情况下此参数值为1,即一个一个容器地更 新。也可根据自己所需进行调整

更新结果可在浏览器的监控查看

docker-swarm集群

全部更新成功。整个过程全为自动