Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式

一、LVS—tun模式介绍及工作原理

IP隧道-IP

IP隧道(IP封装)是一种将IP数据报封装到IP数据报中的技术,它允许将预定IP地址的数据报包装并重定向到另一个IP地址,IP封装技术目前通常被地用在外联网,移动IP,IP广播,隧道式主机。

IP隧道的原理

首先,让我们通过下图了解虚拟主机的IP隧道原理,虚拟主机IP隧道模式与虚拟主机NAT模式最大的不同就是前者是负载均衡器通过IP隧道将请求发送给实服务器,而后者则是通过网络地址翻译将请求发送给实服务器。
Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第1张图片
当用户访问由服务器集群提供的虚拟服务时,一个包含有虚拟主机地址的数据包到达。负载均衡器检查数据包中的目标地址和端口,如果和虚拟服务的地址和端口相匹配,则通过连接调度算法选择一个实服务器,并将此连接添加进记录连接的Hash表中,然后,负载均衡器将源IP地址封装到数据包中并发送给所选择的实服务器。当该连接上的一个数据包到达,并且该连接仍然在Hash表中,则该数据包仍然会以相同的方式被封装并发送给该实服务器。当实服务器接收到封装过的包,首先解包,然后处理该请求,最后通过自己的路由表将应答直接返回给用户。在连接断开或超时后,连接记录将从Hash表中删除。

下图说明了该流程。
Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第2张图片
注意,实服务器可以是任何网络的任何IP地址,它们可以分布在任意的地理位置,但是必须支持IP封包协议,并且将隧道设备全部配置为启用,以便能够正确地对接收的封装过的包进行解包,并且虚拟IP地址必须配置为不响应ARP,或者系统能被配置为可将数据包从虚拟地址重定到本地socket。

最后,当一个封装过的包到达,实服务器解包,并发现该包的目标地址是虚拟地址,表明“噢,这是我的菜,我来搞定。”它处理该请求然后将请求结果直接返回给用户端。

该原理来自于: 架构师成长营——LVS负载均衡之虚拟主机IP隧道模式

二、IP-tun(IP隧道)模式搭建

搭建前提:
我们先清除上一节配置DR模式用ipvsadm写的调度规则。

/etc/init.d/ldirectord stop
ipvsadm -l
ipvsadm -C		#清除规则

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第3张图片

1、加载隧道模块(server1、server2、server3)

modprobe ipip
ip addr show	#会出现tunl0

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第4张图片

2、给tunl0添加ip,并立即激活(负载均衡器server1)

ip addr del 172.25.75.100/24 dev eth0		#清除网卡eth0的IP
ip addr add 172.25.75.100/24 dev tunl0		#将IP添加到tunl0网卡
ip addr show			#查看网卡信息
ip link set up tunl0	#启动网卡

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第5张图片

3、给tunl0添加ip,并立即激活(私有网段【server2、server3】)

ip addr del 172.25.75.100/24 dev eth0		#清除网卡eth0的IP
ip addr add 172.25.75.100/24 dev tunl0		#将IP添加到tunl0网卡
ip addr show tunl0			#查看网卡信息
ip link set up tunl0		#启动网卡

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第6张图片
Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第7张图片

4、编写新策略在负载均衡器server1

ipvsadm -A -t 172.25.75.100:80 -s rr					#添加vip,对后端服务器采用rr算法
ipvsadm -a -t 172.25.75.100:80 -r 172.25.75.2:80 -i		#添加后端真实服务器server2
ipvsadm -a -t 172.25.75.100:80 -r 172.25.75.3:80 -i
ipvsadm -L												##查看策略
/etc/init.d/ipvsadm save								##保存策略

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第8张图片

5、关闭内核反向过滤功能(server2、server3)

sysctl -a | grep rp_filter						#查看参数状态
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.lo.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -a | grep rp_filter

为什么要修改rp_filter参数呢?

有三个值,0、1、2,具体含义:

    0:不开启源地址校验。
    1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
    2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第9张图片
Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第10张图片
注意: 重新保留时,有些参数设置会自动返回1,只要保证tunl0为0时就可以。

6、测试

在客户端上:

curl 172.25.75.100

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第11张图片
成功实现负载均衡。

我们可以在负载均衡器server1上查看此时的调度器状态:

ipvsadm -l

Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式_第12张图片

你可能感兴趣的:(运维)