关于 LVS 系列其他文章的传送门
《 LVS 集群负载器的原理和配置 》
《 LVS 的 DR 模式中 VIP 和 RIP 跨网段的实现方案 》 您当前所在位置
一、拓扑
网络环境
网段
用途
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 通信,后来看到这篇文章中的描述 ,和我遇到了同样的问题。
于是改变思路,调整为下面这种拓扑,让 VIP 成为 DIP、RIP网络的子接口后,实验成功。
对第一种方案失败原因的个人理解 :
在 DR 模式中有一条要求:因为通过 MAC 转发,RS 跟 Dirctory 要在同一物理网络内(不能由路由器分隔,因为 VIPServer 要通过封装 MAC 地址到 RIPServer)!!!
要在同一物理网络 这句话按我的理解是要在同一个二层网络内,因为 DR 模式主要是对二层包头的 MAC 地址做一些手脚,来实现目的。但是如果跨了三层路由可能就不是当初期望的 MAC 包头了。
有了以上结论后,我们把注意力放在第一种方案中,在 Dirctory 中有 VIP 和 DIP/RIP 两个网段,这两个网段虽然在同一台主机内,但却是在两个独立的网卡上的不同网段,所以他们之间的通信就必须经过路由才能到达对方,这就不满足 RS 跟 Dirctory(VIP)要在同一物理网络内 的要求了。
而第二种方案中,VIP 只是 DIP 的子接口,虽然网段不一样,但都是同一块网卡,这不就刚好满足了 “RS 和 Dirctory 要在同一物理网络内” 的要求了吗?经过实验,也验证了第二种方案可以正常运行。
(个人理解,可能有不严谨的地方)
下面记录第二种实验的过程 :
二、配置
创建网络,VIP 和 DIP 虽然可以跨网段,但是必须在同一个物理网络,所以不需要额外创建 VIP 网络,VIP 全部使用 DIP 的子接口。
1. 配置 Route
添加两块网卡,对应 VMnet1 和 VMnet2 的网段并配置 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