1. NAT部署

  • 网络拓扑

    lvs-nat-deploy
    • Client无法直接访问lvs后端的Real Server。

    • 后端Real Server的网关为Director的DIP

  • 环境准备

    • 配置Real Server。主要目的是通过httpd服务测试最终效果。

      [root@RS1 ~]# dnf install httpd
      [root@RS1 ~]# echo "RS1 192.168.194.131" > /var/www/html/index.html
      [root@RS1 ~]# systemctl start httpd
      ​
      [root@RS2 ~]# dnf install httpd
      [root@RS2 ~]# echo “RS2 192.168.194.141” > /var/www/html/index.html
      [root@RS2 ~]# systemctl start httpd

    • 准备Director环境

      #安装lvs的rpm包
      [root@Director ~]# yum install ipvsadm
      ​
      #启用内核的转发功能
      [root@Director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

  • 在director上面配置lvs

    [root@Director ~]# ipvsadm -A -t 10.10.88.128 -s rr
    [root@Director ~]# ipvsadm -a -t 10.10.88.128:80 -r 192.168.194.131 -m
    [root@Director ~]# ipvsadm -a -t 10.10.88.128:80 -r 192.168.194.141 -m
    ​
    [root@Director ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.10.88.128:80 rr
      -> 192.168.194.131:80           Masq    1      0          3         
      -> 192.168.194.141:80           Masq    1      0          4         

  • 测试结果

    root@Client:~# curl 10.10.88.128
    “RS2 192.168.194.141”
    root@Client:~# curl 10.10.88.128
    RS1 192.168.194.131
    root@Client:~# curl 10.10.88.128
    “RS2 192.168.194.141”
    ​
    [root@Director ~]# cat /proc/net/ip_vs_conn
    Pro FromIP   FPrt ToIP     TPrt DestIP   DPrt State       Expires PE
    Name PEData
    TCP 0A0A5802 A456 0A0A5880 0050 C0A8C28D 0050 TIME_WAIT        84
    TCP 0A0A5802 A454 0A0A5880 0050 C0A8C283 0050 TIME_WAIT        82
    TCP 0A0A5802 A452 0A0A5880 0050 C0A8C28D 0050 TIME_WAIT        81  
    ​
    #修改调度算法为WRR
    [root@Director ~]# ipvsadm -E -t 10.10.88.128:80 -s wrr
    ​
    #修改后端real server的端口
    [root@Director ~]# ipvsadm -d -t 10.10.88.128:80 -r 192.168.194.131:80
    [root@Director ~]# ipvsadm -a -t 10.10.88.128:80 -r 192.168.194.131:8080 -m -w 3
    ​
    #修改权重
    [root@Director ~]# ipvsadm -e -t 10.10.88.128:80 -r 192.168.194.131:8080 -m -w 2

2. DR单网段部署

  • 网络部署

    lvs-dr-deploy
  • 环境准备

    • 配置后端RS

      [root@RS1 ~]# dnf install httpd
      [root@RS1 ~]# echo "RS1 192.168.194.131" > /var/www/html/index.html
      [root@RS1 ~]# systemctl start httpd
      [root@RS1 ~]# route -n
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      0.0.0.0         192.168.194.253 0.0.0.0         UG    100    0        0 ens160
      192.168.194.0   0.0.0.0         255.255.255.0   U     100    0        0 ens160
      ​
      ​
      [root@RS2 ~]# dnf install httpd
      [root@RS2 ~]# echo “RS2 192.168.194.141” > /var/www/html/index.html
      [root@RS2 ~]# systemctl start httpd
      ​
    • RS VIP配置

      [root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
      [root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
      [root@RS1 ~]# ifconfig lo: 192.168.194.100 netmask 255.255.255.255
      [root@RS1 ~]# ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
          inet 192.168.194.100/32 scope global lo:
             valid_lft forever preferred_lft forever
          inet6 ::1/128 scope host 
             valid_lft forever preferred_lft forever
      2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
          link/ether 00:0c:29:29:62:df brd ff:ff:ff:ff:ff:ff
          inet 192.168.194.131/24 brd 192.168.194.255 scope global noprefixroute ens160
             valid_lft forever preferred_lft forever
          inet6 fe80::20c:29ff:fe29:62df/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      ​
      [root@RS2 ~]#  echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
      [root@RS2 ~]#  echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
      [root@RS2 ~]# ifconfig lo: 192.168.194.100 netmask 255.255.255.255
      [root@RS2 ~]# ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
          inet 192.168.194.100/32 scope global lo:
             valid_lft forever preferred_lft forever
          inet6 ::1/128 scope host 
             valid_lft forever preferred_lft forever
      2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
          link/ether 00:0c:29:df:65:14 brd ff:ff:ff:ff:ff:ff
          inet 192.168.194.141/24 brd 192.168.194.255 scope global noprefixroute ens160
             valid_lft forever preferred_lft forever
          inet6 fe80::20c:29ff:fedf:6514/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      ​
    • LVS VIP配置

      [root@Director ~]# ifconfig lo:1 192.168.194.100 netmask 255.255.255.255
      [root@Director ~]# ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
          inet 192.168.194.100/32 scope global lo:1
             valid_lft forever preferred_lft forever
          inet6 ::1/128 scope host 
             valid_lft forever preferred_lft forever
      2: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
          link/ether 00:0c:29:44:5c:67 brd ff:ff:ff:ff:ff:ff
          inet 192.168.194.144/24 brd 192.168.194.255 scope global noprefixroute ens36
             valid_lft forever preferred_lft forever
          inet6 fe80::761f:737e:60c0:e36a/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      [root@Director ~]# ipvsadm -A -t 192.168.194.100:80 -s rr
      [root@Director ~]# ipvsadm -a -t 192.168.194.100:80 -r 192.168.194.131:80 -g 
      [root@Director ~]# ipvsadm -a -t 192.168.194.100:80 -r 192.168.194.141:80 -g
      [root@Director ~]# ipvsadm -Ln
      IP Virtual Server version 1.2.1 (size=4096)
      Prot LocalAddress:Port Scheduler Flags
        -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
      TCP  192.168.194.100:80 rr
        -> 192.168.194.131:80           Route   1      0          0         
        -> 192.168.194.141:80           Route   1      0          0         
      ​

注: lo上的VIP掩码最好设置为32位。如果VIP设置的网段中包含了网关的会导致网络通信有问题。

例:VIP设置为192.168.194.100/24 , 并配置在lo上。由于RS的网关为192.168.194.253。当虚拟机访问网关时,流量会直接从lo口出去访问,导致无法正常访问RS。

其实lo口上配置的VIP: 192.168.194.100/24, 即使该RS所在的整个网络里面没有192.168.194.0/24这个网段的IP。这台linux同样可以直接ping通192.168.194.1-192.168.194.254所有的IP。这个算是lo口的一个特性了。

3. DR多网段部署

这里所说的多网段部署,是指VIP与RS的物理网口不在同一个网段。

  • 网络部署

    lvs-dr-multi-network-deploy

    与单网段配置相比,多网段的唯一区别就是将VIP改成了其他网段的IP

  • 网络配置

    router配置

    root@router:~# ifconfig ens33:1 172.0.0.254/24
    root@router:~# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.194.2   0.0.0.0         UG    102    0        0 ens33
    10.10.88.0      0.0.0.0         255.255.255.0   U     101    0        0 ens37
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
    172.0.0.0       0.0.0.0         255.255.255.0   U     0      0        0 ens33
    192.168.194.0   0.0.0.0         255.255.255.0   U     102    0        0 ens33
    ​
    ​

    director配置

    [root@Director ~]# ifconfig lo:1 172.0.0.100 netmask 255.255.255.255
    [root@Director ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.194.253 0.0.0.0         UG    100    0        0 ens36
    192.168.194.0   0.0.0.0         255.255.255.0   U     100    0        0 ens36
    [root@Director ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet 172.0.0.100/32 scope global lo:1
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:44:5c:67 brd ff:ff:ff:ff:ff:ff
        inet 192.168.194.144/24 brd 192.168.194.255 scope global noprefixroute ens36
           valid_lft forever preferred_lft forever
        inet6 fe80::761f:737e:60c0:e36a/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    ​

    RS配置

    [root@RS1 ~]# ifconfig lo:1 172.0.0.100 netmask 255.255.255.255
    [root@RS2 ~]# ifconfig lo:1 172.0.0.100 netmask 255.255.255.255
  • LVS配置

    [root@Director ~]# ipvsadm -A -t 172.0.0.100:80 -s rr
    [root@Director ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.0.0.100:80 rr
    [root@Director ~]# ipvsadm -a -t 172.0.0.100:80 -r 192.168.194.131:80 
    [root@Director ~]# ipvsadm -a -t 172.0.0.100:80 -r 192.168.194.141:80 
    [root@Director ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.0.0.100:80 rr
      -> 192.168.194.131:80           Route   1      0          0         
      -> 192.168.194.141:80           Route   1      0          0   
  • 测试

    root@Client:~# curl 172.0.0.100
    RS2 192.168.194.141
    root@Client:~# curl 172.0.0.100
    RS1 192.168.194.131
    root@Client:~# curl 172.0.0.100
    RS2 192.168.194.141
    root@Client:~# curl 172.0.0.100
    RS1 192.168.194.131

LVS配置脚本

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip='172.0.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='192.168.194.131'
rs2='192.168.194.141'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
case $1 in
start)
    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
    echo "The VS Server is Ready!"
    ;;
stop)
    ipvsadm -C
    ifconfig $iface down
    echo "The VS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

RS配置脚本

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=172.0.0.100
mask='255.255.255.255'
dev=lo:1
#rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
#service httpd start &> /dev/null && echo "The httpd Server is Ready!"
#echo "`hostname -I`" > /var/www/html/index.html
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 $mask #broadcast $vip up
    echo "The RS 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 "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac


熊熊