docker之搭建swarm集群+负载均衡监控,服务上线+滚动更新

1.Swarm集群

Swarm集群Manager Node会不断地监控集群的状态,协调集群状态使得我们预期状态和实际状态保持一致。例如我们启动了一个应用服务,指定服务副本为10,则会启动10个Docker容器去运行,如果某个Worker Node上面运行的2个Docker容器挂掉了,则Swarm Manager会选择集群中其它可用的Worker Node,并创建2个服务副本,使实际运行的Docker容器数仍然保持与预期的10个一致.

2.滚动更新(Rolling Update)

对于服务需要更新的场景,我们可以在多个Node上进行增量部署更新,Swarm Manager支持通过使用Docker CLI设置一个delay时间间隔,实现多个服务在多个Node上依次进行部署。这样可以非常灵活地控制,如果有一个服务更新失败,则暂停后面的更新操作,重新回滚到更新之前的版本。

基本架构

Docker Swarm提供了基本的集群能力,能够使多个Docker Engine组合成一个group,提供多容器服务.Swarm使用标准的Docker API,启动容器可以直接使用docker run命令。Swarm更核心的则是关注如何选择一个主机并在其上启动容器,最终运行服务。 Docker Swarm基本架构,如下图所示:

在这里插入图片描述

如上图所示,Swarm Node表示加入Swarm集群中的一个Docker Engine实例,基于该Docker Engine可以创建并管理多个Docker容器。其中,最开始创建Swarm集群的时候,Swarm Manager便是集群中的第一个Swarm Node。在所有的Node中,又根据其职能划分为Manager Node和Worker Node,具体分别如下所示:

Manager Node

Manager Node负责调度Task,一个Task表示要在Swarm集群中的某个Node上启动Docker容器,一个或多个Docker容器运行在Swarm集群中的某个Worker Node上。同时,Manager Node还负责编排容器和集群管理功能(或者更准确地说,是具有Manager管理职能的Node),维护集群的状态。需要注意的是,默认情况下,Manager Node也作为一个Worker Node来执行Task。Swarm支持配置Manager只作为一个专用的管理Node。

Worker Node

Worker Node接收由Manager Node调度并指派的Task,启动一个Docker容器来运行指定的服务,并且Worker Node需要向Manager Node汇报被指派的Task的执行状态。

3.管理Swarm Node

Swarm支持设置一组Manager Node,通过支持多Manager Node实现HA。那么这些Manager Node之间的状态的一致性就非常重要了,多Manager Node的Warm集群架构,如下图所示:

在这里插入图片描述

通过上图可以看到,Swarm使用了Raft协议来保证多个Manager之间状态的一致性。基于Raft协议,Manager Node具有一定的容错功能,假设Swarm集群中有个N个Manager Node,那么整个集群可以容忍最多有(N-1)/2个节点失效。如果是一个三Manager Node的Swarm集群,则最多只能容忍一个Manager Node挂掉。

环境设定

base2 172.25.78.12 manager
base3 172.25.78.13 node1
base4 172.25.78.14 node2

1.先在真机上制作证书

[root@foundation78 ~]#  vim /etc/hosts
172.25.254.78 westos.org
[root@foundation78 ~]# cd /tmp/docker/
[root@foundation78 docker]# ls
web
[root@foundation78 docker]# mkdir certs
# 制作证书
[root@foundation78 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt         

在这里插入图片描述

[root@foundation78 docker]# ll certs/      # 可以看到生成的domain.crt  domain.key文件

在这里插入图片描述

[root@foundation78 docker]# docker run -d  --restart=always  --name registry \
 -v `pwd`/certs:/certs  \
 -e 	REGISTRY_HTTP_ADDR=0.0.0.0:443 \
 -e    REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \  
 -e 	REGISTRY_HTTP_TLS_KEY=/certs/domain.key  -p 443:443  registry:2

在这里插入图片描述

[root@foundation78 docker]# docker ps

在这里插入图片描述

[root@foundation78 docker]# iptables -t nat -nL

在这里插入图片描述

[root@foundation78 docker]# pwd
/tmp/docker
[root@foundation78 docker]# cd /etc/docker
[root@foundation78 docker]# ls
daemon.json  key.json
[root@foundation78 docker]# mkdir certs.d
[root@foundation78 docker]# cd certs.d
[root@foundation78 certs.d]# mkdir westos.org
[root@foundation78 certs.d]#  cd westos.org
[root@foundation78 westos.org]# cp /tmp/docker/certs/domain.crt   ./ca.crt       # 必须保证证书一致
[root@foundation78 westos.org]#  ls
ca.crt
[root@foundation78 westos.org]# cd /var/www/html/images/
[root@foundation78 images]# ls
centos.tar  demo.tar  game2048.tar  nginx.tar  rhel7.tar  ubuntu.tar
[root@foundation78 images]# docker load -i nginx.tar 
[root@foundation78 images]# docker run -d --name vm1 nginx
[root@foundation78 images]# cd /etc/docker/certs.d/westos.org
[root@foundation78 westos.org]# docker tag nginx westos.org/rhel7    # 重命名
[root@foundation78 westos.org]# docker push westos.org/rhel7      # 上传到私有仓库

在这里插入图片描述

[root@foundation78 westos.org]#  docker login -u wzt -p westos westos.org    # 登陆认证,登陆成功之后下次登陆不用认证

在这里插入图片描述

# 必须做好解析,才能使用真机分享出来的仓库
[root@base2 ~]# vim /etc/hosts
172.25.78.254 westos.org
[root@base3 ~]# vim /etc/hosts
172.25.78.254 westos.org
[root@base4 ~]# vim /etc/hosts
172.25.78.254 westos.org
# 证书必须认证好,如果证书没有认证好,必须在真机重新生成证书,并将证书传递到三台虚拟机
[root@foundation78 westos.org]# pwd
/etc/docker/certs.d/westos.org
[root@foundation78 westos.org]# cd /etc/docker/
[root@foundation78 docker]# scp -r certs.d/ [email protected]:/etc/docker
[root@foundation78 docker]# scp -r certs.d/ [email protected]:/etc/docker
[root@foundation78 docker]# scp -r certs.d/ [email protected]:/etc/docker

2.部署manager

[root@base2 ~]# ls
docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm
docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm.part
[root@base2 ~]# yum install -y docker-engine-* 
[root@base2 ~]# systemctl start docker
[root@base2 ~]# yum install -y bash-*    #  安装一些docker相关工具,方便补全命令
[root@base2 ~]# docker swarm init   # 初始化

在这里插入图片描述

[root@base2 ~]# netstat -antlp

在这里插入图片描述

3.部署从节点

[root@base3 ~]# yum install -y docker-engine-*
[root@base3 ~]# systemctl start docker
[root@base3 ~]# docker swarm join --token SWMTKN-1-4a9b21x8wy3ixwdpwoo5rhf0fhl93w84h65bhr8lgta2kzabgs-93bumn3h27avii2vrstjjxjcd 172.25.78.12:2377

[root@base4 ~]# yum install -y docker-engine-*
[root@base4 ~]# systemctl start docker
[root@base4 ~]# docker swarm join --token SWMTKN-1-4a9b21x8wy3ixwdpwoo5rhf0fhl93w84h65bhr8lgta2kzabgs-93bumn3h27avii2vrstjjxjcd 172.25.78.12:2377

4.在manager端查看节点状态

[root@base2 ~]# docker node ls  # 查看节点状态

在这里插入图片描述

[root@base2 ~]# docker pull westos.org/nginx    # 拉取镜像,拉取之后才能使用

在这里插入图片描述

[root@base3 ~]# docker pull westos.org/nginx 
[root@base4 ~]# docker pull westos.org/nginx 

5.测试

[root@base2 ~]#  docker service ls 

在这里插入图片描述

# 在网页调用三个节点的IP可以分别看到nginx的测试页,说明集群部署成功

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

6.部署集群负载均衡,并监控

[root@foundation78 images]# docker pull docker.io/dockersamples/visualizer  # 获取监控包

在这里插入图片描述

[root@foundation78 images]# docker tag dockersamples/visualizer westos.org/visualizer   # 重命名
[root@foundation78 images]# docker push westos.org/visualizer    # 上传到仓库里

在这里插入图片描述

部署manager

[root@base2 ~]# 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   westos.org/visualizer   #  创建监控
hhrtga74duyo3nnfrylnzx86h
[root@base2 ~]# echo base2 > index.html
[root@base2 ~]# docker ps	
[root@base2 ~]#  docker container cp index.html nginx.3.m7iwv7k31ta6yuxnsl9w6mrdp:/usr/share/nginx/html

在这里插入图片描述

	[root@base2 ~]#  docker service ls   # 直到出现1/1即可

在这里插入图片描述

部署node节点

[root@base3 ~]# docker ps
[root@base3 ~]# echo base3 > index.html
[root@base3 ~]# docker container cp index.html nginx.2.0p98ly1szwxperugzjm0yu0ma:/usr/share/nginx/html

在这里插入图片描述

[root@base4 ~]# docker ps

在这里插入图片描述

[root@base4 ~]# echo base4 > index.html
[root@base4 ~]# docker container cp index.html nginx.1.e2knu5r1gxmjagutcx9bvgc11:/usr/share/nginx/html

在这里插入图片描述

负载均衡测试

[root@foundation78 images]# for i in {1..10}; do curl 172.25.78.12;done

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 关闭一个节点

[root@base3 ~]# systemctl stop docker

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

7.滚动更新服务上线(网页监控)

Swarm 将按照如下步骤执行滚动更新:	

1、停止第一个副本。	
2、调度任务,选择 worker node。	
3、在 worker 上用新的镜像启动副本。	
4、如果副本(容器)运行成功,继续更新下一个副本;如果失败,暂停整个更新过程。	
# 先把game2048封装到私有仓库中
[root@foundation78 ~]# docker tag game2048 westos.org/game2048
[root@foundation78 ~]# docker push westos.org/game2048
# 在manager滚动更新上线game2048服务
[root@base2 ~]# docker service scale nginx=30   # sacle规模可以部署多个容器,为了看到更明显的效果,这里我们多设置几个容器进行监控
nginx scaled to 30
[root@base2 ~]# docker service update --image westos.org/game2048 --update-parallelism 10 --update-delay 10s nginx  # 每10s更新10台迭代更新 
nginx
# 网页监控,服务上线成功

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

# 服务成功上线

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

8.回滚

Swarm 还有个方便的功能是回滚,如果更新后效果不理想,可以通过 --rollback 快速恢复到更新之前的状态。

docker service updata -rollback nginx
注:--rollback 只能回滚到上一次执行 docker service update 之前的状态,并不能无限制地回滚。

猜你喜欢

转载自blog.csdn.net/wzt888_/article/details/88558915
今日推荐