keepalived 不检测虚拟 IP 的丢失

Ger*_*der 8 keepalived

我正在使用 keepalived 在两个虚拟机之间切换浮动 IP。

/etc/keepalived/keepalived.conf 在 VM 1 上:

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 101
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secret
    }
    virtual_ipaddress {
        1.2.3.4
    }
}
Run Code Online (Sandbox Code Playgroud)

/etc/keepalived/keepalived.conf 在 VM 2 上:

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 101
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secret
    }
    virtual_ipaddress {
        1.2.3.4
    }
}
Run Code Online (Sandbox Code Playgroud)

这基本上可以正常工作,但有一个例外:每次 systemd 更新(它运行的是 Ubuntu 18.04)时,它都会重新加载它的网络组件,从而导致丢弃浮动 IP,因为它没有在系统中配置。由于两个keepalived实例仍然可以互相ping通,他们都没有看到任何错误,也没有人对此做出反应,导致浮动IP保持不变。

我发现您可以使用这样的简单脚本检查 IP:

vrrp_script chk_proxyip {
    script "/sbin/ip addr |/bin/grep 1.2.3.4"
}

vrrp_instance VI_1 {
    # [...]
    track_script {
        chk_proxyip
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否是一种可行的方法。

如果我理解正确,如果我在 VM1 上配置此脚本,则会发生以下情况:

  1. 由于 systemd 重启,VM1 丢失 IP
  2. VM1 上的 keepalived 检测到 IP 丢失
  3. keepalived 切换到FAULT状态并停止广播 vrrp 包
  4. VM2 上的 keepalived 检测到 VM1 上的 keepalived 丢失并将浮动 IP 放上去

此时 IP 再次在 VM2 上工作,但 VM1 将保持此状态,因为 IP 永远不会在 VM1 上再次出现。如果 VM2 出现故障(无论出于何种原因)VM1 将不会接管它,因为它仍处于FAULT状态。

如何确保浮动 IP 始终在其中一台 VM 上运行?

进一步测试:

我尝试 ping 浮动 IP 而不是检查它是否在 check_script 中的特定主机上处于活动状态:

vrrp_script chk_proxyip {
    script "/bin/ping -c 1 -w 1 1.2.3.4"
    interval 2
}
Run Code Online (Sandbox Code Playgroud)

在节点 2 上配置此脚本导致以下结果:

  1. 删除节点 1 上的 IP 以进行测试
  2. 节点 2 检测到 IP 丢失并更改BACKUPFAULT
  3. 节点 1 忽略状态变化并停留 MASTER

结果:IP 保持关闭。

在节点 1 上配置脚本导致以下结果:

  1. 删除了节点 1 上的 IP
  2. 节点 1 检测到 IP 丢失并更改MASTERFAULT
  3. 节点2检测到节点1的状态变化并从BACKUP变为MASTER,配置节点2的浮动IP

嗯,然后……

Feb 13 10:11:26 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:27 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:29 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:29 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:32 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:33 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:36 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:36 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:38 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:39 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:41 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:41 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:44 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:45 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:47 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
...
Run Code Online (Sandbox Code Playgroud)

我不得不在 node1 上重新启动 keepalived 以停止节点之间的乒乓游戏。

mp3*_*ley 7

我们遇到了这个问题,并认为这是现在使用 netplan 的 ubuntu 18.04 中的 systemd-networkd 的问题。更新版本的 keepalived 应该解决这个问题,因为它可以检测到导致故障转移的浮动 IP 的删除,请参阅https://github.com/acassen/keepalived/issues/836

更新版本的 keepalived 在 18.04 中不可用,我们决定继续使用 ubuntu 16.04 并等到 ubuntu 20.04 用于使用 keepalived 的服务器,而不是尝试向后移植。


小智 5

此问题已在 2018-05-26 的 keepalived 2.0.0 中修复,请参阅keepalived 的更新日志

  • 监控 VIP/eVIP 删除并转换到备份,如果 VIP/eVIP 被删除,则它被配置为无跟踪选项。