目录
①进入主容器nginx-master修改keepalived的conf文件
②进入副容器nginx-slave修改keepalived的conf文件
今天来更新高可用集群的配置拉~其实还是要有一些前置知识的,比如vim的编辑啊,像怎么进入命令模式、输入模式、底线命令模式,我就不在这篇博客过多赘述了,大家记得去学学哦,同时我是默认大家对docker的命令有了解的哦,其中有部分代码我是直接通过图片截屏的方式展示,因为再打一遍好麻烦嘿嘿(,,・ω・,,)
为何需要进行高可用集群的配置:
nginx 作为负载均衡器,所有请求都到了 nginx,可见 nginx 处于非常重点的位置,如果nginx 服务器宕机,后端 web 服务将无法提供服务,影响严重。为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序(keepalived),通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务 IP 并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务 IP 地址,这样的主服务器就开始再次提供负载均衡服务。
简单理解:主服务器会不断发送“我还活着”的信息给备份服务器,当备份服务器发现主服务器没发“我还活着”的信息,就默认主服务器挂了,这时候就会接管主服务器,自己顶替它上位。当又接收到了“我还活着”就隐居幕后,让主服务器服务工作。
实现目标:
用户输入伪域名www.123.com,给主服务器(nginx-master)和备份服务器(nginx-slave)设置虚拟IP地址(我们简称为VIP),主服务器和备份服务器通过Keepalive脚本监控,看服务器是死是活,最终当其中一个挂了,另一个服务器就代替挂了的服务器访问前端页面。如图更直观:
具体步骤:
一、查看docker网络类型并确定nginx容器所属网络
1、查看网络类型
在命令行输入如下代码:
docker network ls
查看当前docker已有的网络类型 ,类似下图:
其中docker默认的网络类型是:
①bridge(容器有自己的网络资源:虚拟网卡、虚拟IP等等,可以通过交互和外界网络联系)、
②host(容器没有自己独立的网络资源,和宿主机共享网络)、
③none(容器没有任何网络资源,只有独立的网络空间)
我自定义的网络类型是:
①my-network(待会要使用的)
②blog-system_default(我之前制作博客系统自定义的网络)
2、确定子网范围
在命令行输入如下代码:
docker network inspect my-network
我们重点查看这个自定义网络的网关、子网范围和在该网络内创建的容器使用的IP,如图:
子网范围(Subnet):172.19.0.0/16即172.19.0.0~172.19.255.254,待会创建容器时自定义的IP要在自定义网络的子网范围内
网关(Gateway):1172.19.0.1,不可拿来设置为VIP
容器(Containers):已使用的IP有172.19.0.2、172.19.0.3、172.19.0.4,所以待会创建两个nginx容器(nginx-master和nginx-slave)时就不可以使用这些ip
二、创建容器修改文件
1、自定义镜像
①方法一
创建dockerfile,写入:
# 基于官方 Nginx 镜像
FROM nginx:latest
# 安装 Vim 和 Keepalived
RUN apt-get update && apt-get install -y vim keepalived
# 配置 Keepalived
COPY keepalived.conf /etc/keepalived/keepalived.conf
# 配置 Nginx
COPY nginx.conf /etc/nginx/nginx.conf
# 启动 Keepalived 和 Nginx
CMD ["sh", "-c", "service keepalived start && nginx -g 'daemon off;'"]
之后再配置keepalive和nginx的conf文件,可以直接去问ai哈
②方法二
先用nginx镜像直接创建基础的nginx-master,之后在容器内下载keepalive和vim编辑包,利用这个创建的nginx-master容器(记得删除)创建新镜像nginx-keep-vim,通过新镜像创建的容器包含keepalived和vim编辑包(不用再额外单独安装),而且其中的keepalived的conf文件会默认以之前的nginx-master的conf文件为默认模板
2、创建容器添加权限
在命令行输入如下代码:
docker run -d --name nginx-master --network my-network --ip 172.19.0.5 -p 81:80 --cap-add=NET_ADMIN --cap-add=NET_RAW --cap-add=SYS_MODULE --restart always nginx-keep-vim
docker run -d --name nginx-slave --network my-network --ip 172.19.0.6 -p 82:80 --cap-add=NET_ADMIN --cap-add=NET_RAW --cap-add=SYS_MODULE --restart always nginx-keep-vim
3、编辑并查看keepalived的conf文件
①进入主容器nginx-master修改keepalived的conf文件
state_MASTER和interface eth0:说明该容器是主服务器,网络接口是默认的eth0
virtual_router_id 51:主容器和副容器的virtual_router_id要相同
priority 100:主服务器的优先级要确保比备份服务器的优先级高
unicast_peer:此处要确保是备份容器nginx-slave的实际ip
virtual_ipaddress:VIP需在Docker网络子网内172.19.0.0~172.19.255.254(不可与网关172.19.0.1重合)
②进入副容器nginx-slave修改keepalived的conf文件
state_BACKUP和interface eth0:说明该容器是副服务器,网络接口是默认的eth0
virtual_router_id 51:主容器和副容器的virtual_router_id要相同
priority 50:主服务器的优先级要确保比备份服务器的优先级高
unicast_peer:此处要确保是主容器nginx-master的实际ip
virtual_ipaddress:VIP需在Docker网络子网内172.19.0.0~172.19.255.254(不可与网关172.19.0.1重合)与主容器文件中的VIP要一致
③修改nginx静态资源方便查看(选做)
进入nginx-master容器的/usr/share/nginx/html目录(nginx存放静态资源的目录),修改index.html文件(可用自己创建的静态页面也可以)很有成就感哦~~
同理处理nginx-slave容器的html文件
ps:接下来的演示只是修改了其中的h1标签
三、VIP测试
1、直接测试
2、通过是否有返回值判断
启动keepalived进行检测
只有nginx-master有返回值说明此时主服务器是正常的没有宕机
停止主容器nginx-master,进行人为的故障宕机,再次检测查看
再次测试VIP绑定,发现由于主容器宕机,VIP被分配到了备份容器nginx-slave的eth0接口
测试成功
3、通过查看nginx的conf文件判断是否成功
当VIP绑定到了主容器nginx-master时,副容器h1标签也是显示主容器的内容
当VIP绑定到了副容器nginx-slave时,主容器h1标签也是显示副容器的内容
额外的话:
每次重新启动容器都要重新启动keepalived(可以通过编入dockerfile中【未编】来优化)
# 主容器 docker exec -d nginx-master keepalived -n -D -l -f /etc/keepalived/keepalived.conf
# 备容器 docker exec -d nginx-slave keepalived -n -D -l -f /etc/keepalived/keepalived.conf