我正在使用 CentOS 7 和 keepalived 构建概念验证负载均衡器。
我参考了 Red Hat 的负载均衡器管理指南,实现了一个带有 2 个节点的 NAT 负载均衡器,用于在公网和私网之间传输流量。为此,负载均衡器有 2 个 VIP:一个用于客户端流量,位于公网;另一个用于确保响应流量的故障转移,位于私网。
2 个负载均衡器(lb1 和 lb2)正在向内部网络上运行 apache 的 2 个主机(fe1 和 fe2)发送流量。lb1 是主主机,lb2 是备份主机。
示意图如下:
负载均衡器正常工作,并且当其中一个控制器发生故障时按预期进行故障转移。
让我感到烦恼的是,真实服务器上的传入流量不是来自内部 VIP(10.10.33.254),而是来自负载均衡器主机的真实地址(10.10.33.2 和 10.10.33.3)。尽管内部 VIP 被设置为真实服务器的默认网关,但真实服务器的 Ping 也通过真实 IP 地址,而不是内部 VIP。
跟踪路由(lb1 为活动状态):
[root@rsfe2 ~]# tracepath www.google.com
1: rsfe2 0.081ms pmtu 1500
1: 10.10.33.2 0.385ms
1: 10.10.33.2 0.385ms
2: no reply
3: 192.168.1.1 1.552ms
(lb1 向下,lb2 处于活动状态):
[root@rsfe2 ~]# tracepath www.google.com
1: rsfe2 0.065ms pmtu 1500
1: 10.10.33.3 0.463ms
1: 10.10.33.3 0.462ms
2: no reply
3: 192.168.1.1 2.394ms
路由表:
[root@rsfe2 ~]# ip route
default via 10.10.33.254 dev enp0s8 proto static metric 1024
10.10.33.0/24 dev enp0s8 proto kernel scope link src 10.10.33.12
尽管存在这种明显的异常,从客户端的角度来看,从一个负载均衡器到另一个负载均衡器的故障转移按预期进行,这似乎是由于来自幸存的负载均衡器的免费 ARP。
看起来内部 VIP 除了用于 ARP 公告之外没有用于任何其他用途(最终没有往返于它的流量)。
我应该担心这个吗,或者它是否按预期工作?
我的keepalived.conf
内容:
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
router_id LVS_DEVEL
}
vrrp_sync_group VG1 {
group {
RH_EXT
RH_INT
}
}
vrrp_script check_haproxy {
script "/bin/pkill -0 -F /var/run/haproxy.pid"
interval 1
fall 1
rise 5
}
vrrp_instance RH_EXT {
state MASTER
interface enp0s3
virtual_router_id 50
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass password123
}
virtual_ipaddress {
192.168.10.80
}
track_script {
check_haproxy
}
track_interface {
enp0s3
}
}
vrrp_instance RH_INT {
state MASTER
interface enp0s8
virtual_router_id 2
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass password123
}
virtual_ipaddress {
10.10.33.254
}
track_script {
check_haproxy
}
track_interface {
enp0s8
}
}
virtual_server 192.168.10.80 80 {
lb_algo rr
lb_kind NAT
real_server 10.10.33.11 80 {
HTTP_GET {
url {
path /check.html
}
}
}
real_server 10.10.33.12 80 {
HTTP_GET {
url {
path /check.html
}
}
}
}
答案1
我相当确定您在这种情况下确实在使用 VIP。您看到本机 IP 的原因仅仅是由于 traceroute 的性质。每个跳跃都设计为让设备生成 ICMP 错误,系统将始终使用其适配器的主地址发送该错误。
答案2
我认为你应该尝试从外部网络输入 VIP 进行复查,我认为配置没有问题。你在 traceroute 中看到 IP 的原因在于它的性质。