使用Vagrant进行LVS/DR的实验

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
标签:Vagrant 发布于:2019-11-11 22:03:32