0%

LVS 的 DR 模式中 VIP 和 RIP 跨网段的实现方案

关于 LVS 系列其他文章的传送门

  1. 《 LVS 集群负载器的原理和配置 》

  2. 《 LVS 的 DR 模式中 VIP 和 RIP 跨网段的实现方案 》      您当前所在位置



lvs

一、拓扑

网络环境

网段 用途
172.16.0.0/24 客户端网络
192.168.0.0/24 VIP 网络
10.10.0.0/24 DIP/RIP 网络

测试环境一共 5 台虚拟机

主机 ip
Route 客户端网关:172.16.0.1/24 内网网关:10.10.0.1/24 VIP 网关:192.168.0.1/24
Director DIP:10.10.0.11 VIP: 192.168.0.11
Realserver 1 RIP: 10.10.0.12 VIP: 192.168.0.11
Realserver 2 RIP: 10.10.0.13 VIP: 192.168.0.11
Client 172.16.0.100

拓扑图

重要注意
第一次实验时由于使用了下面这种架构(VIP 作为一个单独的网络,而不是子接口),导致 RS 虽然可以给客户端发响应报文,但无法建立正常的 TCP 通信,后来看到这篇文章中的描述,和我遇到了同样的问题。
dr-error

于是改变思路,调整为下面这种拓扑,让 VIP 成为 DIP、RIP网络的子接口后,实验成功。

dr_ip

对第一种方案失败原因的个人理解

在 DR 模式中有一条要求:因为通过 MAC 转发,RS 跟 Dirctory 要在同一物理网络内(不能由路由器分隔,因为 VIPServer 要通过封装 MAC 地址到 RIPServer)!!!

要在同一物理网络这句话按我的理解是要在同一个二层网络内,因为 DR 模式主要是对二层包头的 MAC 地址做一些手脚,来实现目的。但是如果跨了三层路由可能就不是当初期望的 MAC 包头了。

有了以上结论后,我们把注意力放在第一种方案中,在 Dirctory 中有 VIPDIP/RIP 两个网段,这两个网段虽然在同一台主机内,但却是在两个独立的网卡上的不同网段,所以他们之间的通信就必须经过路由才能到达对方,这就不满足 RS 跟 Dirctory(VIP)要在同一物理网络内 的要求了。

而第二种方案中,VIP 只是 DIP 的子接口,虽然网段不一样,但都是同一块网卡,这不就刚好满足了 “RS 和 Dirctory 要在同一物理网络内” 的要求了吗?经过实验,也验证了第二种方案可以正常运行。

(个人理解,可能有不严谨的地方)

下面记录第二种实验的过程

二、配置

创建网络,VIP 和 DIP 虽然可以跨网段,但是必须在同一个物理网络,所以不需要额外创建 VIP 网络,VIP 全部使用 DIP 的子接口。
vmware

1. 配置 Route

添加两块网卡,对应 VMnet1VMnet2 的网段并配置 IP。
VIP 网关配置在 ens39:0 上。

1
2
3
ens33:   inet 172.16.0.1/24 brd 172.16.0.255
ens39: inet 10.10.0.1/24 brd 10.10.0.255
ens39:0 inet 192.168.0.1/24 brd 192.168.0.255

也可以不配置子接口,而是通过添加静态路由实现,效果一样。这里使用子接口方式,所以没有添加路由。

1
route add -host 192.168.0.11 dev ens39

记得打开内核转发。

1
echo 1 > /proc/sys/net/ipv4/ip_forward

2. 配置 Realserver 1 和 2

RS1 和 RS2 上各添加一块 VMnet2 网卡,配置 IP。

1
2
3
4
5
6
7
# Realserver 1 上的 IP
ens33: 10.10.0.12
gw: 10.10.0.1

# Realserver 2 上的 IP
ens33: 10.10.0.13
gw: 10.10.0.1

在两台 RS 上执行配置脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
#
#

vip=192.168.0.11
mask='255.255.255.255'
vipni=lo

case $1 in
start)
# 关闭 ARP 应答和响应
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/$vipni/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/$vipni/arp_announce

# 清空防火墙规则
iptables -X
iptables -F

# 把 VIP 配置在 lo:0 接口 防止和其他主机沟通 掩码32 只广播给自己
ifconfig $vipni:0 $vip netmask $mask broadcast $vip up

# 配置路由 只要是到 VIP 的报文,就走 vipni 网卡
route add -host $vip dev $vipni:0
;;
stop)
# 关闭网卡
ifconfig $vipni down

# 恢复 ARP 应答和响应
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/$vipni/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/$vipni/arp_announce

# 清空防火墙规则
iptables -X
iptables -F
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac

查看 RIP | VIP 和路由信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.0.1 0.0.0.0 UG 100 0 0 ens33
10.10.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.0.11 0.0.0.0 255.255.255.255 UH 0 0 0 lo

[root@node2 ~]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.0.12 netmask 255.255.255.0 broadcast 10.10.0.255

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0

lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.0.11 netmask 255.255.255.255

安装 httpd 并添加主页测试文件。

1
2
3
4
5
6
7
# Realserver 1 上
yum install httpd -y && systemctl start httpd
echo Realserver 11111 test page > /var/www/html/index.html

# Realserver 2 上
yum install httpd -y && systemctl start httpd
echo Realserver 22222 test page > /var/www/html/index.html

2. 配置 Director

添加一块 VMnet2 的网卡并配置 IP。

1
2
ens33: inet 10.10.0.11/24
gw: 10.10.0.1

执行 Director 的配置脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
#
#

vip='192.168.0.11'
iface='ens33:0'
mask='255.255.255.0'
port='80'
rs1='10.10.0.12'
rs2='10.10.0.13'
scheduler='wrr'
type='-g'

case $1 in
start)
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F

ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac

查看 DIP | VIP 和路由信息。VIP 配置在 ens33:0 子接口上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.0.1 0.0.0.0 UG 100 0 0 ens33
10.10.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33

[root@node1 ~]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.0.11 netmask 255.255.255.0 broadcast 10.10.0.255

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.11 netmask 255.255.255.0 broadcast 192.168.0.11

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0

3. Client 测试

在 Client 添加一块 VMnet1 网卡。
配置 IP。

1
2
ens33: 172.16.0.100/24
gw: 172.16.0.1

访问 VIP 测试,可以看到在轮询访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@Client ~]# while true; do curl 192.168.0.11 ; sleep 1 ;done
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page
Realserver 22222 test page
Realserver 11111 test page