如何通过直接路由方法配置 Keepalived 作为 L4 负载均衡器

如何通过直接路由方法配置 Keepalived 作为 L4 负载均衡器

尝试通过 HAProxy 前面的 Keepalived 实现 L4 负载平衡,HAProxy 将充当 L7 负载平衡器。Keepalived 和 HAProxy 位于不同的机器上。我设法使下图中的所有内容正常工作,但当我尝试向公共虚拟 IP(即 115.101.1.17)发送请求时,连接总是超时

根据我对文档的理解,文档指出:

为了让真实服务器能够直接响应公共用户的请求,每个真实服务器在发送回复时必须使用VIP作为其源地址。

我尝试使用 HAProxy 机器上的 SNAT 重置源 IP,但仍然发生同样的事情。

真实服务器(HAProxy 机器)上 iptables 使用的规则

iptables \
  -A POSTROUTING \
  -t nat \
  -p tcp \
  --dport 80 \
  -j SNAT \
  --to-source 115.101.1.17

keepalived配置文件

vrrp_instance VI_1 {
  state       MASTER     # [1]
  interface   eth0       # [2]
  advert_int  1          # [3]
  priority    100        # [4]

  virtual_router_id  92  # [5]

  # Authentication for VRRP messages
  authentication {
    auth_type  PASS
    auth_pass  pass123
  }

  virtual_ipaddress {
    115.101.1.17 dev eth0  # [6]
  }
}

virtual_server 115.101.1.17 80 {
  lb_algo   rr             # [1]
  lb_kind   DR             # [2]
  protocol  TCP

  delay_loop           10  # [3]
  persistence_timeout  60  # [4]

  # Backend Server (HAProxy LB-01)
  real_server 10.0.1.2 80 {
    weight 100

    TCP_CHECK {
      connect_timeout 5
      nb_get_retry 3
      delay_before_retry 2
    }
  }

  # Backend Server (HAProxy LB-02)
  real_server 10.0.1.3 80 {
    weight 100

    TCP_CHECK {
      connect_timeout 5
      nb_get_retry 3
      delay_before_retry 2
    }
  }
}

系统配置参数

net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

任何帮助将不胜感激。

keepalived 和 haprxoy 设置的图像

答案1

您使用的是 DR 模式,因此当数据包到达 HAProxy 服务器时,它会说“嗨,我正在寻找 VIP 115.101.1.17...”,而 HAProxy 必须回答“是的,那就是我”。因此它必须绑定到该地址。并且它所运行的 Linux 机器也必须配置为接受到该地址的流量。因此您需要解决 arp 问题。尝试谷歌搜索 Dr 模式 arp 问题 Linux。

https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/section_vmd_ys2_4r.html

或者将 lbkind 更改为 NAT 模式,然后仅使用保持活动节点作为默认网关。这应该很容易,因为您已经有两个子网了。

不过我个人还是比较同意安德鲁斯博客关于DR模式的说法的:https://www.loadbalancer.org/blog/15-years-later-we-still-love-dsr/

相关内容