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 之前的状态,并不能无限制地回滚。