docker部署keepalived非抢占单播模式

之前咱们学习了keepalive的各种模式,详情可以查看这个笔记https://sulao.cn/post/877.html,这次我们就在上次学习的基础上部署keepalive非抢占单播模式

在配置部署之前我们我们先了解下单播,组播,广播这些词的概念

单播:在同一局域网内,两个设备点对点的通信就是单播通信。
组播:在同一网络可达范围内,一个网络设备与关心其数据的部分设备进行通信就是组播。
广播:在同一网络可达范围内,一个网络设备向本网络内所有设备进行通信就是广播。

在组播模式下,keepalived将全部的心跳包信息都会向默认的224.0.0.18的组播地址发送,这样会产生众多的无用信息,这对于有多个keepalived实例时甚至会产生干扰和冲突,因此须要将组播模式改成单播默认是一种安全的做法,可以避免局域网内有大量的keepalived形成虚拟路由id的冲突。

微信截图_20240102194122.png

上面介绍完一些概念性的东西,下面我们部署下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

微信截图_20220830141601.png

keepalived将优先级从100改成了98,然后将本机设置为BACKUP状态,然后回收了VIP

然后我查看192.168.1.74的keepalived日志,可以到如下信息

keepalived将优先级从98改成了100,然后本机设置为MASTER,然后设置了VIP,将VIP绑到了本机网卡上

微信截图_20220830141813.png

这是我们使用http://192.168.1.75访问nginx网页发现返回的是原本设置的192.168.1.74的默认网页

image.png

最后可以使用tcpdump命令检测

tcpdump -i eth0 -nn -p vrrp

微信截图_20240102195904.png

可以看到没有跟之前一样一直发包到224.0.0.18这个IP地址了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/879.html