LVS/DR模式,数据流来的时候走VS,回去的时候调度到RS上,然后用VIP的作为源地址返回回去。
实验采用Vagrant配置网络和主机信息。Vagrant的用法可参考 Vagrant–快速搭建实验环境利器(http://www.yulongjun.com/linux/20170811-vagrant/)。
Vagrantfile配置文件:
Vagrant.configure("2") do |config|
# config为全局配置文件
config.vm.box = "longdream/centos7" # 这里是我自定义的centos7模板
config.hostmanager.enabled = true # 启用hostmanager插件
config.hostmanager.manage_guest = true # 允许更新虚拟机上的hosts文件
config.hostmanager.manage_host = true # 允许更新主机上的hosts文件
# 定义Client
config.vm.define "client" do |client|
client.vm.network "private_network", ip: "172.16.111.123"
client.vm.hostname = "client"
client.vm.provision "shell", inline: "sudo bash /vagrant/client.sh"
end
# 定义Router
config.vm.define "router" do |router|
router.vm.network "private_network", ip: "172.16.111.222"
router.vm.network "private_network", ip: "192.168.111.222"
router.vm.hostname = "router"
router.vm.provision "shell", inline: "sudo bash /vagrant/router.sh"
end
# 定义VS
config.vm.define "vs" do |vs|
vs.vm.network "private_network", ip: "192.168.111.100"
vs.vm.hostname = "vs"
vs.vm.provision "shell", inline: "sudo bash /vagrant/vs.sh"
end
# 定义RS1
config.vm.define "rs1" do |rs1|
rs1.vm.network "private_network", ip: "192.168.111.101"
rs1.vm.hostname = "rs1"
rs1.vm.provision "shell", inline: "sudo bash /vagrant/rs1.sh"
end
# 定义RS2
config.vm.define "rs2" do |rs2|
rs2.vm.network "private_network", ip: "192.168.111.102"
rs2.vm.hostname = "rs2"
rs2.vm.provision "shell", inline: "sudo bash /vagrant/rs2.sh"
end
end
Vagrantfile里每一台机器都运行了相应的脚本。
Client:
client.sh
#!/bin/bash
echo "GATEWAY=172.16.111.222" >> /etc/sysconfig/network-scripts/ifcfg-eth1
ifdown eth1 && ifup eth1
Router:
router.sh
#!/bin/bash
echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
echo 1 > /proc/sys/net/ipv4/ip_forward
VS:
vs.sh
#!/bin/bash
echo "GATEWAY=192.168.111.222" >> /etc/sysconfig/network-scripts/ifcfg-eth1
ifdown eth1 && ifup eth1
yum install -y ipvsadm
bash /vagrant/vs-dr-wlc.sh start
vs.sh引用的vs-dr-wlc.sh来启动VS。
vs-dr-wlc.sh:
#!/bin/bash
vip=192.168.111.200
mode=g # m为NAT模式,g为DR模式,i为tun模式
schdule=wlc
rip1=192.168.111.101
rip2=192.168.111.102
dev=lo:1
case $1 in
start)
ifconfig $dev $vip netmask 255.255.255.255 broadcast $vip up
ipvsadm -A -t $vip:80 -s $schdule
ipvsadm -a -t $vip:80 -r $rip1 -$mode -w 3
ipvsadm -a -t $vip:80 -r $rip2 -$mode -w 1
;;
stop)
ipvsadm -C
ifconfig $dev down
;;
*)
echo "Usage: `basename $0` start|stop"
exit 1
;;
esac
RS1
rs1.sh:
#!/bin/bash
echo "GATEWAY=192.168.111.222" >> /etc/sysconfig/network-scripts/ifcfg-eth1
ifdown eth1 && ifup eth1
yum install -y httpd
cat >/var/www/html/index.html<<EOF
Real Server 1
EOF
systemctl enable httpd
systemctl start httpd
bash /vagrant/rs-config.sh start
RS2
rs2.sh:
#!/bin/bash
echo "GATEWAY=192.168.111.222" >> /etc/sysconfig/network-scripts/ifcfg-eth1
ifdown eth1 && ifup eth1
yum install -y httpd
cat >/var/www/html/index.html<<EOF
Real Server 2
EOF
systemctl enable httpd
systemctl start httpd
bash /vagrant/rs-config.sh start
两个RS都调用的一个脚本
rs-config.sh
#!/bin/bash
vip=192.168.111.200
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask 255.255.255.255 broadcast $vip up
echo "VS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "VS Server is Cancel!"
;;
*)
echo "Usage `basename $0` start|stop"
exit 1
;;
esac
vagrant up启动所有机器后,在Virtualbox里关掉所有虚机的eth0(vagrant创建虚机时候,默认的一个NAT网络,默认在eth0上,关闭它以防止对实验造成影响):
ifdown eth0
然后从Client虚机里运行:
bash /vagrant/client-test.sh进行测试:
#!/bin.bash
# 测试LVS
vip=192.168.111.200
for i in `seq 100`;do
curl --connect-timeout 1 $vip
sleep 1
done