NAT基础:

    在外部请求到达调度器(director)上VIP之后,LVS使工作在input链上,定义了所谓的集群规则,强行改变了报文的流转规则,变成了prerouting-->input-->postrouting。

    ipvsadm:用户空间的命令行工具,用于管理集群服务规则,这并不是必须的;

    ipvs是工作在内核空间中net fileter的input链上;


说明:

    CIP:客户端的IP地址;

    VIP:lvs负载均衡调度器上的面向客户端的IP地址;

   DIP:lvs负载均衡调度器上的面向服务器的IP地址;

    RIP:后端服务器的IP地址。

    RS:后端服务器

    director:负载均衡调度器


NAT类型的相关内容:

    多目标的DNAT(iptables):它通过修改请求报文的目标IP地址(同时可能会修改目标端口)至挑选出的某RS的RIP地址实现转发;

    (1)RS和DIP应该使用私网地址,且RS得网关应该指向DIP;

    (2)请求和响应报文都要经过director转发,在极高负载的场景中,director可能会成为整个系统的瓶颈;

    (3)支持端口映射;

    (4)RS可以使用任意操作系统;

    (5)RS的RIP和director的DIP必须在同一IP网络;


模型图:

    wKioL1YuRVOhNXt5AAEvnD5wNLY637.jpg

lvs nat模型实现负载均衡的详细过程:

    黑色的代表请求报文:请求报文从客户端到达director上网卡1时,其源地址:cip,目标地址:vip。经过director上的在input链上规则的强行转发,将请求报文经过postrouting送到网卡2上。通过调度算法,找出一台RS,同时将请求报文的目标IP修改为RIP(调度算法找出的RS的IP),将请求报文发送到RS上。

    红色的代表应答报文:应答报文从服务器上到达director上的网卡2时,其源IP:RIP,目标IP:CIP。通过iptables上的prerouting-->forward-->postrouting,将应答报文的源地址改为VIP,应答报文送回到客户端,调度结束。


详细实现:

    拓扑结构图:

        1代表VIP所在网卡,其IP地址为172.16.125.5,采用桥接模式;

        2代表DIP所在网卡,其IP地址为192.168.100.1,采用vmnet2模式;

        3代表客户端,IP地址为172.16.125.127,外网,采用桥接模式;

        4代表主机RS1,提供web等服务的后端服务器,其IP地址为192.168.100.2,网关为DIP(192.168.100.1),采用vmnet2模式;

        5代表主机RS2,提供web等服务的后端服务器,其IP地址为192.168.100.3,网关为DIP(192.168.100.1),采用vmnet2模式。

        wKiom1YuRY6wCwGJAABuCMYX80Y375.jpg

    

    配置步骤:

        (1)在director上配置两块网卡,一块作为vip所在网卡,其IP地址为172.16.125.5(桥接模式)。一块作为地dip所在网卡,其IP地址为192.168.100.1,netmask=255.255.255.0(vmnet2)。

        (2)在director上安装ipvsadm该程序包。

        (3)配置两台RS,RS1的ip地址为192.168.100.2,gateway=192.168.100.1(使用vmnet2)。RS2的ip地址为192.168.100.3,gateway=192.168.100.1(使用vmnet2)。配置完IP地址后,使用ping命令测试RS1和RS2能否和网关以及互相之间进行通信。

        (4)在两台RS上安装httpd,然后为了实现lvs的调度方法,在此处故意使得两个RS上提供的网页文件内容不一样,方便体现出效果。当然在实际的应用当中应该使两个RS上提供的网页内容一样。同时启动两个RS上的httpd服务。

            注意:为了保证后续步骤可以正常进行,在director上首先对两台RS上的http服务进行测试。

        (5)确保director上的iptables所有的规则都要清空,由于ipvs和iptables很多规则是不能共存的。打开内核中的核心转发功能。

            查看是否打开了核心转发功能:

[root@7-1 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@7-1 ~]# cat /proc/sys/net/ipv4/ip_forward

            第一种方法:编辑/etc/sysctl.conf,在该配置文件中加入net.ipv4.ip_forward = 1即可。

        (6)定义ipvs规则,将后端两台RS加入集群服务中。

[root@7-1 ~]# ipvsadm -A -t 172.16.125.5:80 -s rr
[root@7-1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.125.5:80 rr
[root@7-1 ~]# ipvsadm -a -t 172.16.125.5:80 -r 192.168.100.2 -m
[root@7-1 ~]# ipvsadm -a -t 172.16.125.5:80 -r 192.168.100.3 -m
[root@7-1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.125.5:80 rr
  -> 192.168.100.2:80             Masq    1      0          0         
  -> 192.168.100.3:80             Masq    1      0          0

        (7)在此处使用的调度算法为rr,也就是轮询算法,进行测试显示调度效果。

        wKioL1YuRqvgQ0x3AAD2HbtgHBk624.jpg