如何让Keepalived的VIP在主备节点重启后始终保持激活状态?
看起来你碰到的是Keepalived默认行为的典型问题——它只会让主节点持有VIP,备节点会自动移除,甚至主节点重启后,备节点的VIP也会被清掉。我之前帮不少人解决过类似需求,给你两个可行的方案,你可以根据自己的环境选择:
方案一:让系统网络配置持久化VIP,脱离Keepalived的自动管理
这个方案最直接,把VIP的控制权从Keepalived手里拿回来,交给系统本身的网络配置,这样不管Keepalived怎么切换状态,VIP都会一直存在:
在所有节点上持久化VIP
如果你用的是Debian/Ubuntu系(基于netplan):
编辑你的netplan配置文件(通常是/etc/netplan/00-installer-config.yaml),在对应网卡下添加VIP地址:network: ethernets: enp0s3: addresses: - 192.168.1.100/24 # 你的VIP地址 # 保留原有的网关、DNS等配置 version: 2保存后执行
sudo netplan apply让配置生效,重启节点测试,VIP应该会自动加载。如果是CentOS/RHEL系:
复制网卡配置文件,创建子接口配置:sudo cp /etc/sysconfig/network-scripts/ifcfg-enp0s3 /etc/sysconfig/network-scripts/ifcfg-enp0s3:0编辑新创建的
ifcfg-enp0s3:0文件,内容修改为:TYPE=Ethernet NAME=enp0s3:0 DEVICE=enp0s3:0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.1.100 NETMASK=255.255.255.0保存后重启网络服务:
sudo systemctl restart network,重启节点验证VIP是否存在。
修改Keepalived配置,不再管理VIP
打开Keepalived配置文件(通常是/etc/keepalived/keepalived.conf),找到vrrp_instance块里的virtual_ipaddress部分,把其中的192.168.1.100/24条目删掉。这样Keepalived就只会负责主备选举和VRRP通告,不会再添加或删除VIP。解决ARP冲突问题
因为所有节点都有同一个VIP,为了避免网络ARP混乱,需要让备节点不响应VIP的ARP请求,只让主节点响应。在所有节点的/etc/sysctl.conf里添加以下配置:net.ipv4.conf.enp0s3.arp_ignore=1 net.ipv4.conf.enp0s3.arp_announce=2 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2执行
sudo sysctl -p让配置生效。这样备节点会忽略针对VIP的ARP查询,只有主节点会回应,流量依然正常导向主节点,同时所有节点的VIP都保持激活。
方案二:用自定义Notify脚本覆盖Keepalived的默认删除行为
如果你不想改动系统网络配置,也可以通过Keepalived的通知脚本来强制保留VIP:
创建Notify脚本
新建一个脚本文件,比如/usr/local/bin/keepalived_vip_keep.sh,内容如下:#!/bin/bash VIP="192.168.1.100/24" INTERFACE="enp0s3" # 根据Keepalived的状态执行操作 case "$1" in BACKUP) # 切换到备节点时,检查VIP是否存在,不存在就添加 if ! ip addr show dev $INTERFACE | grep -q "$VIP"; then ip addr add $VIP dev $INTERFACE fi ;; MASTER) # 切换到主节点时,同样确保VIP存在 if ! ip addr show dev $INTERFACE | grep -q "$VIP"; then ip addr add $VIP dev $INTERFACE fi ;; FAULT) # 节点故障时也保留VIP(可根据需求调整) if ! ip addr show dev $INTERFACE | grep -q "$VIP"; then ip addr add $VIP dev $INTERFACE fi ;; esac给脚本加执行权限:
sudo chmod +x /usr/local/bin/keepalived_vip_keep.sh修改Keepalived配置,启用脚本
打开keepalived.conf,在你的vrrp_instance块里添加以下内容:notify_backup "/usr/local/bin/keepalived_vip_keep.sh BACKUP" notify_master "/usr/local/bin/keepalived_vip_keep.sh MASTER" notify_fault "/usr/local/bin/keepalived_vip_keep.sh FAULT"这样每当Keepalived切换状态时,就会调用这个脚本,确保VIP不会被删除。
处理ARP冲突
和方案一一样,需要配置arp_ignore和arp_announce参数,步骤参考方案一的第3点。
我更推荐方案一,因为它把VIP的持久化和Keepalived的主备选举职责分开,逻辑更清晰,也不容易出问题。方案二适合不想改动系统网络配置的场景,但要注意脚本的权限和Keepalived的执行环境。
备注:内容来源于stack exchange,提问作者Yonoss




