You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让Keepalived的VIP在主备节点重启后始终保持激活状态?

如何让Keepalived的VIP在主备节点重启后始终保持激活状态?

看起来你碰到的是Keepalived默认行为的典型问题——它只会让主节点持有VIP,备节点会自动移除,甚至主节点重启后,备节点的VIP也会被清掉。我之前帮不少人解决过类似需求,给你两个可行的方案,你可以根据自己的环境选择:

方案一:让系统网络配置持久化VIP,脱离Keepalived的自动管理

这个方案最直接,把VIP的控制权从Keepalived手里拿回来,交给系统本身的网络配置,这样不管Keepalived怎么切换状态,VIP都会一直存在:

  1. 在所有节点上持久化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是否存在。

  2. 修改Keepalived配置,不再管理VIP
    打开Keepalived配置文件(通常是/etc/keepalived/keepalived.conf),找到vrrp_instance块里的virtual_ipaddress部分,把其中的192.168.1.100/24条目删掉。这样Keepalived就只会负责主备选举和VRRP通告,不会再添加或删除VIP。

  3. 解决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:

  1. 创建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

  2. 修改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不会被删除。

  3. 处理ARP冲突
    和方案一一样,需要配置arp_ignorearp_announce参数,步骤参考方案一的第3点。


我更推荐方案一,因为它把VIP的持久化和Keepalived的主备选举职责分开,逻辑更清晰,也不容易出问题。方案二适合不想改动系统网络配置的场景,但要注意脚本的权限和Keepalived的执行环境。

备注:内容来源于stack exchange,提问作者Yonoss

火山引擎 最新活动