keepalived 在 20.04 上无法正常工作

keepalived 在 20.04 上无法正常工作

我正在运行 Ubuntu 20.04.1 LTS。我已经使用 3 台机器和一个 VIP 设置了 keepalived。我可以看到 keepalived 正在按预期从主/从服务器添加和删除 VIP。但是,我的 ubuntu 盒子都没有“绑定”到这个 VIP。我可以 ping VIP(确认 icmp 数据包击中了正确的盒子/主服务器),但没有给出任何响应。我已将“net.ipv4.ip_nonlocal_bind = 1”添加到 /etc/sysctl.conf。确认:

猫/ proc / sys / net / ipv4 / ip_nonlocal_bind 1

我已经运行:iptables --flush

我已经尝试过:modprobe ip_vs

我可以通过以下方式将 IP(用于测试的 VIP 地址)添加到 eth0:ip address add 192.168.1.131/24 dev eth0 并正常 ping 此 IP。(这只是为了测试,已被删除)

我看到通过keepalived绑定到nic的虚拟IP:

inet 192.168.1.70/24 brd 192.168.1.255 scope global dynamic eth0
   valid_lft 85701sec preferred_lft 85701sec
inet 192.168.1.131/32 scope global eth0  <-------
   valid_lft forever preferred_lft forever

但是,我无法通过此 VIP ping 通它或访问任何服务。ip_nonlocal_bind 功能似乎不知何故损坏了。也许缺少内核模块?

注意 - 这些是在 Xen 上运行的 Ubuntu VM。我有 CentOs7 VM,它们在同一个虚拟机管理程序上与 keepalived 一起正常工作。

答案1

我是keepalived的维护者,也是我实现了vrrp_strict。

首先,我很抱歉您在升级所使用的 keepalived 版本时遇到了麻烦,并因此浪费了时间。

我们确实尝试保持与旧版本 keepalived 支持的旧配置的向后兼容性,但有时这并不总是可能的,特别是当代码不按照文档工作时,或者错误修复需要稍微改变功能时。

正如 keepalived.conf(5) 手册页所述,vrrp_strict 旨在强制执行严格的 VRRP 协议合规性。最初实施时,它并没有检查不符合 RFC 的配置选项的每个方面,但随着版本的推移,这种执行已经得到改进。这是为了在与严格遵守的 VRRP 实现交互时帮助配置 keepalived。

在这种情况下,指定了 vrrp_strict,但 keepalived v1.3.5 没有应用对 accept 模式的检查。由于 VRRPv2 不支持 accept_mode,因此后来添加了该检查。

没有记录错误的原因是,就 keepalived 而言,没有错误;它只是对未指定的参数 (accept/no_accept) 应用了默认值。如果配置了 accept,keepalived 会记录:“(VI_1) 警告 - VRRP 版本 2 的接受模式不符合 RFC3768 - 正在重置”。

RFC 设想 VRRP 将在 IP 路由器上使用,附加路由器可以备份主路由器,并且 VIP 是自然属于主路由器的地址,但如果主路由器不可用,备份路由器将支持路由目的。因此,它的概念是,只有主路由器可以在任何 VIP 上寻址,因为它们是主路由器自己的 IP 地址,但备份路由器不应通过 VIP 寻址。在备份路由器上配置 VIP(当它们成为主路由器时)的唯一目的是使它们能够响应 ARP 请求,以便终端站可以将数据包发送到其 IP 地址进行转发。这就是为什么如果 VRRP 实例的优先级不是 255,vrrp_strict 将 no_accept 模式设置为默认模式的原因。

鉴于您指出的一直在使用的发行版,我假设您已经从 v1.3.5 升级到 v2.0.19(如果使用 keepalived snap,则升级到 v2.2.21)。

不幸的是,我看不出我们如何才能做得更好。vrrp_strict 已经配置好了,而 keepalived v1.3.5 还没有完全实现这一点;随着时间的推移,vrrp_strict 的实现已经得到改进,可以更好地满足手册页所述的要求。

如果对如何更好地完成这类事情有任何建议,我们很乐意考虑它们。

我将更新 keepalived.conf(5) 手册页,以更好地记录 vrrp_strict 时进行的检查,现在它将显示以下内容:

    # Enforce strict VRRP protocol compliance. This currently includes 
    #  enforcing the following. Please note that other checks may be
    #  added in the future if they are found to be missing:
    #   0 VIPs not allowed
    #   unicast peers not allowed
    #   IPv6 addresses not allowed in VRRP version 2
    #   First IPv6 VIP is not link local
    #   State MASTER can be configured if and only if priority is 255
    #   Authentication is not supported
    #   Preempt delay is not supported
    #   Accept mode cannot be set for VRRPv2
    #   If accept/no accept is not specified, accept is set if priority
    #    is 255 aand cleared otherwise
    #   Gratuitous ARP repeats cannot be enabled
    #   Cannot clear lower_prio_no_advert
    #   Cannot set higher_prio_send_advert
    #   Cannot use vmac_xmit_base

答案2

更新 - 我找到了错误/解决方案。我使用的配置是从旧版本的 keepalived(centOs7 VM 上使用的版本)复制而来的。在全局部分,有一行打破了常规:

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server smtp.gmail.com
   smtp_connect_timeout 30

   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict <-----------THIS MO FO!
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

可悲的是,我们花了很长时间才找到这个。请注意,系统日志中没有任何内容显示“错误”:

 keepalived.service - Keepalive Daemon (LVS and VRRP)
     Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-02-01 17:21:18 UTC; 17s ago
   Main PID: 13352 (keepalived)
      Tasks: 2 (limit: 4677)
     Memory: 1.6M
     CGroup: /system.slice/keepalived.service
             ├─13352 /usr/sbin/keepalived --dont-fork
             └─13361 /usr/sbin/keepalived --dont-fork

Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: Registering Kernel netlink reflector
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: Registering Kernel netlink command channel
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: (Line 40) Unknown configuration entry 'lable' for ip address ->
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: (Line 40) Unknown configuration entry 'eth0:vip' for ip addres>
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: (VI_1) State MASTER must match being address owner
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: (VI_1) Strict mode does not support authentication. Ignoring.
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: Registering gratuitous ARP shared channel
Feb 01 17:21:18 ubuntu4 Keepalived_vrrp[13361]: (VI_1) Entering BACKUP STATE (init)
Feb 01 17:21:22 ubuntu4 Keepalived_vrrp[13361]: (VI_1) Entering MASTER STATE

我希望这对某人有帮助。我将联系:版权所有 (C) 2001-2019 Alexandre Cassen,[电子邮件保护] 在 github 上。

相关内容