美文网首页
LVS-NAT、LVS-DR的工作原理并实现配置

LVS-NAT、LVS-DR的工作原理并实现配置

作者: 任总 | 来源:发表于2018-07-15 22:49 被阅读27次

一、ipvs相关和安装:

首先查看内核ipvs相关

[root@C712 ~]# cd /boot
[root@C712 boot]# ls
config-3.10.0-693.el7.x86_64
[root@C712 boot]# grep -i 'ipvs' -C 10 config-3.10.0-693.el7.x86_64 
.....
CONFIG_NETFILTER_XT_MATCH_IPVS=m #编译到内核
......
CONFIG_IP_VS_PROTO_TCP=y#对tcp支持
CONFIG_IP_VS_PROTO_UDP=y#对udp支持
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler   #支持哪些算法
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
[root@C712 boot]# yum install ipvsadm -y #安装ipvsadm
ipvsadm:
  • 程序包:ipvsadm
  • Unit File: ipvsadm.service
  • 主程序:/usr/sbin/ipvsadm
  • 规则保存工具:/usr/sbin/ipvsadm-save
  • 规则重载工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config

ipvsadm命令:

核心功能:有两个
1、集群服务管理:增、删、改;
2、集群服务的RS管理:增、删、改;
查看:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]#新增或修改一个集群服务
ipvsadm -D -t|u|f service-address#删除一个集群服务
ipvsadm -C#清空所有的
ipvsadm -R#恢复和重载规则
ipvsadm -S [-n]#保存规则
ipvsadm -a|e -t|u|f service-address -r server-address [options]#向一个已有的集群服务添加或修改一个server
ipvsadm -d -t|u|f service-address -r server-address向一个已有的集群服务删除一个server
ipvsadm -L|l [options]#查看集群服务
ipvsadm -Z [-t|u|f service-address]#清空计数器

二、管理集群服务:增、改、删;

1、管理集群服务增加和修改:

格式:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

2、删除:

格式:ipvsadm -D -t|u|f service-address

3、地址格式:

service-address:
-t|u|f:
-t: TCP协议的端口,VIP:TCP_PORT
-u: UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,是一个数字;

4、调度算法格式

[-s scheduler]:指定集群的调度算法,默认为wlc;

三、管理集群上的RS:增、改、删;

1、管理集群上的RS增加和修改:

格式:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

2、管理集群上的RS删除:

格式:ipvsadm -d -t|u|f service-address -r server-address

3、地址格式:

server-address:
rip[:port]:rip地址加端口

四、命令选项:

1、lvs类型:

-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重;

2、清空定义的所有内容:

ipvsadm -C

3、 查看:
ipvsadm -L|l [options]

--numeric, -n:numeric output of addresses and ports#数字格式显示地址和端口,不要反解
--exact:expand numbers (display exact values)#精确显示计数器的值
--connection, -c:output of current IPVS connections#当前活动和非活动连接
--stats:output of statistics information#统计数据
--rate :output of rate information#速率

4、保存和重载:

ipvsadm -S = ipvsadm-save#保存
ipvsadm -R = ipvsadm-restore#重载

五、设计与实现

1、负载均衡集群设计时要注意的问题:
  • (1) 是否需要会话保持;
  • (2) 是否需要共享存储;
  • 共享存储:NAS, SAN, DS(分布式存储)

2、设计要点和环境:

设计要点:

(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP;
(2) 支持端口映射;
(3) Director要打开核心转发功能;

集群环境

实验环境 四台centos7虚拟机,分别是vs调度器、rs1后端服务器、rs2后端服务器、client客户端


服务器ip

rs1和rs2分别关闭防火墙,安装httpd和telnet-server,更改ip地址,网关指向vs调度服务器的DIP网卡172.16.1.254

配置测试页面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服务器
<h1>RS1 172.16.1.11</h1> 
[root@rs1 ~]#systemctl start httpd

[root@rs2 ~]# vim /var/www/html/test.html#rs2服务器
<h1>RS2 172.16.1.12</h1> 
[root@rs2 ~]#systemctl start httpd

并把虚拟机网络连接模式改成仅主机模式,来模拟内网环境。


rs服务器网卡改成仅主机模式

vs调度服务器配置:
关闭防火墙和selinux,添加一个网卡


添加一个网卡
[root@vs ~]# nmtui#设置网卡命令
[root@vs ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.6  netmask 255.255.255.0  broadcast 192.168.1.255

ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.1.254  netmask 255.255.255.0  broadcast 172.16.1.255

然后将ens37网卡设置成仅主机模式,使其与rs1、rs2同一网段:


设置新添加网卡也是仅主机模式

3、实现 LVS-NAT

[root@vs ~]# ipvsadm -A -t 192.168.1.6:80 -s rr #设置调度服务器规则,rr是轮询调度
[root@vs ~]# 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.1.6:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.11 -m#把rs1服务器加入规则里
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.12 -m#把rs1服务器加入规则里
[root@vs ~]# 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.1.6:80 rr
  -> 172.16.1.11:80               Masq    1      0          0         
  -> 172.16.1.12:80               Masq    1      0          0         
[root@vs ~]# sysctl -w net.ipv4.ip_forward=1#打开核心转发
net.ipv4.ip_forward = 1

客户端测试:

[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>

vs服务器端:

[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s wrr#修改为加权轮询模式
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.12 -m -w 2#修改加权轮询
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.11 -m -w 3#修改加权轮询
[root@vs ~]# 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.1.6:80 rr
  -> 172.16.1.11:80               Masq    3      0          5         
  -> 172.16.1.12:80               Masq    2      0          5     

客户端测试:

[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s sh   #把来自于同一地址的ip发往同一个rs服务器
[root@vs ~]# ipvsadm -ln --stats#统计数据
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.1.6:80                     32      192      128    16032    15424
  -> 172.16.1.11:80                     17      102       68     8517     8194
  -> 172.16.1.12:80                     15       90       60     7515     7230
[root@vs ~]# ipvsadm -ln -c#追踪访问源地址
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:55  TIME_WAIT   192.168.1.10:34606 192.168.1.6:80     172.16.1.11:80

4、lvs-dr的实现:

image.png
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1) 在前端网关做静态绑定;
(2) 在各RS使用arptables;
(3) 在各RS修改内核参数,来限制arp响应和通告的级别;
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
限制通告级别:arp_announce
0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
1:尽量避免向非直接连接网络进行通告;
2:必须避免向非本网络通告;

  • rs1和rs2分别关闭防火墙,安装httpd和telnet-server,更改ip地址,网关指向路由器。
rs1服务器配置
配置测试页面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服务器
<h1>RS1 172.16.1.11</h1> 
[root@rs1 ~]# vim /var/www/html/phpinfo.php
<h1>RS1</h1>#rs1php测试信息页
<?php
 phpinfo();
            ?>
[root@rs1 ~]# vim setparam.sh#编辑脚本
#!/bin/bash
#
vip=192.168.1.99
mask='255.255.255.255'

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 lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0#设置本地地址广播

;;
stop)#停止还原成0值
ifconfig lo:0 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 "Usage $(basename $0) start|stop"
exit 1
;;
esac
[root@rs1 ~]# bash -n setparam.sh #检查脚本语法
[root@rs1 ~]# bash -x setparam.sh start#启动脚本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0

[root@rs1 ~]# scp setparam.sh 192.168.1.12:/tmp#把脚本传给rs2服务器
[root@rs1 ~]#systemctl start httpd

rs2服务器配置
[root@rs2 ~]# vim /var/www/html/test.html#rs2服务器
<h1>RS2 172.16.1.12</h1> 
[root@rs2 ~]# vim /var/www/html/phpinfo.php
<h1>RS2</h1>#rs2php测试信息页
<?php
 phpinfo();
            ?>
[root@rs2 ~]# cd /tmp
[root@rs2 tmp]# ls
setparam.sh
[root@rs2 tmp]# bash -x setparam.sh start#执行脚本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0


[root@rs2 ~]#systemctl start httpd
设置vs调度服务器:
[root@vs ~]# ifconfig ens33:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up#设置广播地址
[root@vs ~]# ifconfig
.......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.99  netmask 255.255.255.255  broadcast 192.168.1.99
        ether 00:0c:29:8e:29:6a  txqueuelen 1000  (Ethernet)

......
[root@vs ~]# yum -y install ipvsadm#安装lvs
[root@vs ~]# ipvsadm -A -t 192.168.1.99:80 -s rr#设定轮询规则
[root@vs ~]# 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.1.99:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.11 -g#给规则加入rs1服务器
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -g#给规则加入rs2服务器
[root@vs ~]# 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.1.99:80 rr
  -> 192.168.1.11:80              Route   1      0          0         
  -> 192.168.1.12:80              Route   1      0          0         
客户端测试:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.99/test.html;done
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
php测试1 php测试2 访问测试页1 访问测试页2

相关文章

网友评论

      本文标题:LVS-NAT、LVS-DR的工作原理并实现配置

      本文链接:https://www.haomeiwen.com/subject/jfqguftx.html