之前咱们学习了keepalive的各种模式,详情可以查看这个笔记https://sulao.cn/post/877.html,这次我们就在上次学习的基础上部署keepalive非抢占单播模式
在配置部署之前我们我们先了解下单播,组播,广播这些词的概念
单播:在同一局域网内,两个设备点对点的通信就是单播通信。 组播:在同一网络可达范围内,一个网络设备与关心其数据的部分设备进行通信就是组播。 广播:在同一网络可达范围内,一个网络设备向本网络内所有设备进行通信就是广播。
在组播模式下,keepalived将全部的心跳包信息都会向默认的224.0.0.18的组播地址发送,这样会产生众多的无用信息,这对于有多个keepalived实例时甚至会产生干扰和冲突,因此须要将组播模式改成单播默认是一种安全的做法,可以避免局域网内有大量的keepalived形成虚拟路由id的冲突。
上面介绍完一些概念性的东西,下面我们部署下keepalived单播非抢占模式
我的环境如下
192.168.1.72 docker环境 192.168.1.73 docker环境 192.168.1.74 docker环境 192.168.1.75 VIP
首先我们先把VIP绑定到192.168.1.72这台机器,我的网卡名是eth0
ip addr add 192.168.1.75/24 dev eth0
然后我们开始部署测试用的nginx
分别在三台机器创建nginx目录
mkdir -p /data/nginx mkdir -p /data/nginx/{etc,www,logs}
在192.168.1.72上机器创建nginx默认网页
vi /data/nginx/www/index.html <head> <title>test nginx</title> </head> <body> test docker deploy nginx from 192.168.1.73 ! </body> </html>
在192.168.1.73上机器创建nginx默认网页
vi /data/nginx/www/index.html <html> <head> <title>test nginx</title> </head> <body> test docker deploy nginx from 192.168.1.73 ! </body> </html>
在192.168.1.74上机器创建nginx默认网页
vi /data/nginx/www/index.html <html> <head> <title>test nginx</title> </head> <body> test docker deploy nginx from 192.168.1.74 ! </body> </html>
然后使用docker部署nginx并使用上述默认网页
docker run -itd -p 8888:80 --name nginx -v /data/nginx/www:/usr/share/nginx/html -v /data/nginx/logs:/var/log/nginx nginx:latest
通过上述部署以后我们尝试使用http://+8888的形式测试是否能访问nginx网页返回test docker deploy nginx from 192.168.1.72/73/74 !的内容,如果可以显示说明nginx这里就已经部署好了
紧接着我们部署keepalive
分别在三台机器创建keepalive目录
mkdir -p /data/keepalive mkdir -p /data/keepalive/{conf,check}
在192.168.1.72上机器创建keepalive配置文件,单播模式须要关闭vrrp_strict,需要在VIP实例配置段加入单播的源地址和目标地址,同时非抢占模式所有节点stat都填写BACKUP,如果使用了MASTER非抢占模式nopreempt就会失效
vi /data/keepalive/conf/keepalived.conf global_defs { router_id R1 #vrrp_strict #关闭这个参数或者不加这个参数 script_user root enable_script_security } vrrp_script check_k8s { script "/data/keepalive/check/script.sh" interval 2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 nopreempt #preempt delay 300 # 延迟抢占 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 192.168.1.72 #自己的IP #单播模式 unicast_peer { 192.168.1.73 #另一个IP,如果有多个写多行 192.168.1.74 } virtual_ipaddress { 192.168.1.75/24 #VIP } track_script { check_k8s } }
在192.168.1.73和192.168.1.73上机器创建keepalive配置文件,注意不要重复proority的值,同时unicast_src_ip和unicast_peer的IP都要对应改为自己的和其他两个的IP
vi /data/keepalive/conf/keepalived.conf global_defs { router_id R2 #vrrp_strict #关闭这个参数或者不加这个参数 } vrrp_script check_k8s { script "/data/keepalive/check/script.sh" interval 2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 nopreempt priority 99 #preempt delay 300 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 192.168.1.73 #自己的IP #单播模式 unicast_peer { 192.168.1.72 #另一个IP,如果有多个写多行 192.168.1.74 } virtual_ipaddress { 192.168.1.75/24 #VIP } track_script { check_k8s } }
两台节点的检测脚本都是同一个,脚本内容如下,分别在两台机器该位置创建
vi /data/keepalive/check/script.sh #!/bin/bash count=`netstat -ntpl | grep 8888 | wc -l` if [ $count -gt 0 ]; then exit 0 else exit 1 fi
赋予该脚本执行权限
chmod +x /data/keepalive/check/script.sh
最后我们启动keepalive容器
docker run -itd --name keepalived --restart=always \ --cap-add=NET_ADMIN \ --cap-add=NET_BROADCAST \ --cap-add=NET_RAW \ --net=host \ -v /data/keepalive/conf:/usr/local/etc/keepalived \ -v /data/keepalive/check:/data/keepalive/check \ osixia/keepalived:2.0.20
最后我们测试VIP的漂移
我们尝试停止192.168.1.72上的nginx
docker stop nginx
这是我们打印192.168.1.72上的keepalived日志,可以到如下信息
docker logs -f keepalived
keepalived将优先级从100改成了98,然后将本机设置为BACKUP状态,然后回收了VIP
然后我查看192.168.1.74的keepalived日志,可以到如下信息
keepalived将优先级从98改成了100,然后本机设置为MASTER,然后设置了VIP,将VIP绑到了本机网卡上
这是我们使用http://192.168.1.75访问nginx网页发现返回的是原本设置的192.168.1.74的默认网页
最后可以使用tcpdump命令检测
tcpdump -i eth0 -nn -p vrrp
可以看到没有跟之前一样一直发包到224.0.0.18这个IP地址了。