LVS的nat模式
NAT工作原理
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
所以从上面的过程来看,数据包的收集和响应都要经过lvs调度器。
NAT模式特点:
RS应该使用私有地址,RS的网关必须指向DIP
DIP和RIP必须在同一个网段内
请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
支持端口映射
RS可以使用任意操作系统
缺陷:对Director Server压力会比较大,请求和响应都需经过director server
实践LVS的NAT模式:
实验环境:
192.168.75.63:lvs调度器
192.168.75.64:realserver1
192.168.75.65:realserver2
这里真实的环境中,lvs调度器应该是有两个网卡,一个与外网通信,一个与内网通信,但此处都是内网的虚拟机,所以只涉及到一个网卡
安装配置:
两台realserver安装nginx
这里不做赘述了
在两个nginx的根目录下输出不同的测试字段以作识别:
75.64
75.65
lvs调度器安装ipvsadm:
yum install -y ipvsadm
lvs调度器上编辑nat实现脚本:75.63
[root@VM-75-63 ~]# cat lvs_nat.sh
#!/bin/bash
#开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
#关闭icmp重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
#echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects #这里把eth1的禁掉了,因为咱只有一个网卡
#设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
#设置ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.75.63:80 -s wrr
$IPVSADM -a -t 192.168.75.63:80 -r 192.168.75.64:80 -m -w 1
$IPVSADM -a -t 192.168.75.63:80 -r 192.168.75.65:80 -m -w 1
保存后,在调度器上运行该脚本。
ok,测试能否实现负载均衡,访问http://192.168.75.63/
....
....
....
此时访问你会发现有连接超时,
然后我们防火墙也关了,那是为什么呢?
注意: 一定要在两台realserver上添加默认网关,IP为调度器的内网IP。
OK,我们继续操作:
在两台realserver上添加网关:
route add default gw 192.168.75.63
[root@VM-75-64 html]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.75.0 * 255.255.255.0 U 0 0 0 eth1
link-local * 255.255.0.0 U 1002 0 0 eth1
default 192.168.75.63 0.0.0.0 UG 0 0 0 eth1
default 192.168.75.1 0.0.0.0 UG 0 0 0 eth1
[root@VM-75-65 html]# route add default gw 192.168.75.63
[root@VM-75-65 html]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 0 0 0 ens32
default gateway 0.0.0.0 UG 0 0 0 ens32
default gateway 0.0.0.0 UG 100 0 0 ens32
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker_gwbridge
192.168.75.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32
这里75.65是centos7.2,所以显示会有些不同。
ok,再次尝试访问连接:
有了,我们再刷新试试:
你看,是不是两个都出来了,而且这里我们采用的是轮询方式负载均衡,但是通过测试发现,并不是二者一人一次出现,有些节点会保持比较长时间,又是看起来又比较均匀, 猜测跟nginx的缓存有关。
ok,基于nat的lvs负载均衡就看到这里
以上,共勉!