raft协议
问题:假设一个节点挂了,其他节点是否可用?
Raft协议:保证大多数节点存活;>1,集群>3
以下01 02 03 03 指的是四台服务器
#将docker1机器停止,宕机
#docker-01
systemctl stop docker
docker-02 docker-04
docker node ls
[root@VM-0-8-centos ~]# docker node ls
Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
#docker-01
systemctl start docker
#docker-03
#工作节点变成管理节点
[root@VM-0-16-centos ~]# docker swarm join --token SWMTKN-1-30uc8rx1jk9v671nif6tw1otge9lyy3nj45xtzu1q7ehc4h793-e5cm85lrpbbcczmmggcsr99dv 172.16.0.8:2377
Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
[root@VM-0-16-centos ~]# docker swarm leave
Node left the swarm.
[root@VM-0-16-centos ~]# docker swarm join --token SWMTKN-1-30uc8rx1jk9v671nif6tw1otge9lyy3nj45xtzu1q7ehc4h793-e5cm85lrpbbcczmmggcsr99dv 172.16.0.8:2377
This node joined a swarm as a manager.
#docker-04
[root@VM-0-8-centos ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pdc7fbmtypcqcgdbwkgfeixjo VM-0-7-centos Ready Active 19.03.13
ddosg74pvzbil5cozcyuw4p5f * VM-0-8-centos Ready Active Leader 19.03.13
lb4ujyjftne3t0ojhb1o7nhhw VM-0-11-centos Ready Active Reachable 19.03.13
rp8zyu3xmulxwalabtvuqjw7v VM-0-16-centos Down Active 19.03.13
sbpz4hqc6nps4e0ucxvd8o57g VM-0-16-centos Ready Active Reachable 19.03.13
#至此,将三台机器设置成,管理节点
#在三台管理节点满足高可用前提下,关闭其中一台docker服务,测试
01
[root@VM-0-11-centos ~]# systemctl stop docker
#docker-04 docker-03 照样可以使用
[root@VM-0-8-centos ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pdc7fbmtypcqcgdbwkgfeixjo VM-0-7-centos Ready Active 19.03.13
ddosg74pvzbil5cozcyuw4p5f * VM-0-8-centos Ready Active Leader 19.03.13
lb4ujyjftne3t0ojhb1o7nhhw VM-0-11-centos Ready Active Unreachable 19.03.13
rp8zyu3xmulxwalabtvuqjw7v VM-0-16-centos Down Active 19.03.13
sbpz4hqc6nps4e0ucxvd8o57g VM-0-16-centos Ready Active Reachable
回顾
docker run 单机模式下:基础模式(不用了)
docker-compose up 单机模式下:启动一个项目上线!
docker service 集群swarm下集群节点
k8s service pods
容器变成服务(服务中有个概念叫做副本):比如redis服务有10个副本,就是同时开启10个redis容器。swarm可以动态扩展redis副本的数量。
就好像多个tomcat的负载均衡。以前是需要手写nginx配置,现在可以动态扩容缩容。
集群:高可用,web->redis (3台),分布在不同机器上!
docker service 动态扩展
灰度发布:
平滑升级项目。肯定不能停止网站,404,伤流量。
如何实现?
docker service create --help
docker service create -p 8888:80 --name mynginx nginx 类似于docker run只不过能扩容
#工作节点启动服务失败
[root@VM-0-7-centos ~]# docker service create -p 8888:80 --name mynginx nginx
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
#管理节点操作
[root@VM-0-16-centos ~]# docker service create -p 8888:80 --name mynginx nginx
2qcjcuwkex4a7j0z5ee5pp1du
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
#总结:docker run 容器启动!不具有扩缩容器
# docker swervice 服务!具有扩缩容器,滚动更新
# docker-管理节点查看
[root@VM-0-16-centos ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
2mml3eiankpd mynginx.1 nginx:latest VM-0-8-centos Running Running 2 minutes ago
[root@VM-0-11-centos ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2qcjcuwkex4a mynginx replicated 1/1 nginx:latest *:8888->80/tcp
小结:
docker run 容器启动!不具有扩缩容器
docker swervice 服务!具有扩缩容器,滚动更新
查看服务 REPLICAS(副本)
启动一个服务,会在管理节点主机里随机启动。例如我在docker1启动,会在docker3上开启
#上述启动nginx服务情况只是启动一个副本
#现在给其他两个管理节点增加 服务副本
[root@VM-0-11-centos ~]# docker service update --replicas 3 mynginx
mynginx
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
#只要在集群里面,无论访问哪个ip都可以访问服务;
#集群为单位的机器
动态扩缩容
#1.扩容测试
[root@VM-0-11-centos ~]# docker service update --replicas 10 mynginx
mynginx
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged
[root@VM-0-8-centos ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2qcjcuwkex4a mynginx replicated 9/9 nginx:latest *:8888->80/tcp
#总结:因为容器之间是相互隔离,所以开多少个容器取决于硬件条件允许,一个服务器节点可以同时开多个服务;
#一个服务可以有多个副本,动态扩缩容,实现高可用
#2.缩容测试
#mynginx 服务回滚到一个副本
[root@VM-0-16-centos ~]# docker service update --replicas 1 mynginx
mynginx
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
[root@VM-0-16-centos ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2qcjcuwkex4a mynginx replicated 1/1 nginx:latest *:8888->80/tcp
#3.另一种方式的扩缩容命令
[root@VM-0-16-centos ~]# docker service scale mynginx=5
mynginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
[root@VM-0-11-centos ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2qcjcuwkex4a mynginx replicated 5/5 nginx:latest *:8888->80/tcp
#4.移除服务
[root@VM-0-8-centos ~]# docker service rm mynginx
mynginx
[root@VM-0-8-centos ~]# docker service ps mynginx
no such service: mynginx
[root@VM-0-8-centos ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
注:一个service对应一个端口
总结:
弹性,扩缩容非常重要;
副本 所对应的服务既可以运行在管理节点也可以运行在工作节点;
集群搭建好,服务创建好,任何集群内的ip地址都可以访问集群所提供的服务;
一个服务可以有多个副本,动态扩缩容,实现高可用;
只要会用docker swarm 搭建集群 docker service create 启动服务,docker service scale 或者docker service update 动态管理容器就可以了