深入浅出 LVS 负载均衡系列:
深入浅出 LVS 负载均衡(一)NAT、FULLNAT 模型原理
- 两台计算机如何在互联网中通信
LVS 负载均衡
通过修改数据包的「源 IP 地址」或 「目标 IP 地址」
- NAT 模式
- FULLNAT 模式
深入浅出 LVS 负载均衡(二)DR、TUN 模型原理
LVS 负载均衡
通过修改数据包的「目标 MAC 地址」
- DR 模式
通过二次封装数据包的「IP 报文」
- TUN 模式
深入浅出 LVS 负载均衡(三)实操 NAT、TUNNEL 模型、深入浅出 LVS 负载均衡(四)实操 DR 模型、Keepalived DR 模型的高可用
- 使用 UCloud 云主机实操各个模型
- 使用 Keepalived 实现 LVS-DR 的高可用
LVS(Linux Virtual Server)是一个虚拟服务器集群系统。工作在 OSI 模型的传输层,即四层负载均衡。LVS 本身实现了 NAT、DR、TUN 模型,这些模型仅做数据包的转发,而不会与客户端建立连接,成本低效率高。FULLNAT 基于 NAT 实现,LVS 本身不支持,需要额外对内核打补丁后才能使用。
<aside>
📌 本系列按照负载均衡器对数据包的处理方式分类,从计算机间通信的角度出发,浅谈 NAT、FULLNAT、DR、TUN 模型的实现原理。
</aside>
之前介绍了 LVS 负载均衡 NAT、FULLNAT、DR、TUN 模型的实现原理。现在来动手实践一下~
实验环境
LVS 目前已经是 Linux 内核中的一部分,在内核中的模块叫做 ipvs,支持 NAT、DR、TUNNEL 模型。用户不能直接操作 ipvs 模块,需要安装交互软件 ipvsadm,使用 ipvsadm 和 ipvs 进行交互。
我使用 3 台 UCloud 云主机来搭建实验环境,创建云主机的时候选择分时购买,更划算一点。
实验机器及环境
3 台 UCloud 云主机,CentOS 7.9 64位,1 核 1 G,需要注意一下防火墙规则,我选择的是【Web服务器推荐】,开放 22、3389、80、443 的端口号,这个可以自行配置
- 两台 Real Server:RS01、RS02,一台负载均衡服务器:LB01
- RS01:10.23.190.76、RS02:10.23.122.152、LB01:10.23.21.184
- RS01、RS02 安装 httpd,快速启动 http 服务器,且配置不同的请求响应
- LB01 安装 ipvsadm,并启动 ipvsadm
- 实验机器展示
NAT 模式实操
回顾一下 NAT 模式的特点
- NAT 模式修改数据包的「目标 IP 地址」或 「源 IP 地址」,所有的请求数据包、响应数据包都要经过负载均衡器,所以 NAT 模式支持对端口的转换
- 真实服务器的默认网关是负载均衡器,所以真实服务器和负载均衡器必须在同一个网段
实操开始,首先我们要做一些前置的准备工作,即把该安装的软件和服务,安装和启动起来。
RS01、RS02 安装 httpd,快速启动 http 服务
- yum install httpd -y && service httpd start
- echo "Hello From RS01/RS02" > /var/www/html/index.html
- 验证:curl 0.0.0.0,返回对应的信息
LB01 安装 ipvsadm,并启动 ipvsadm
- yum install ipvsadm && ipvsadm --save> /etc/sysconfig/ipvsadm && service ipvsadm start
看到下图就表示成功启动了 ipvsadm
- yum install ipvsadm && ipvsadm --save> /etc/sysconfig/ipvsadm && service ipvsadm start
做完这些前置准备工作之后,接下来我们来对照 NAT 模式来配置具体的负载规则。
RS01、RS02
设置默认网关为 DIP,即 LB01 的内网 IP - 10.23.21.184
查看 RS01、RS02 当前的默认网关
- route -n
- 可以看到当前的默认网关是 10.23.0.1
- route -n
设置默认网关为 10.23.21.184
- route add default gw 10.23.21.184
- 输入命令并按下回车之后,会很长时间没有响应,是正常的。我们等它连接断掉之后,再通过 LB01 登陆到 RS01、RS02 上
删除之前的默认网关
- route del default gw 10.23.0.1
- route del default gw 10.23.0.1
LB01
配置路由入口规则,使用 -A 参数
- 因为实验使用的是云主机,而云主机的 EIP 或者说外网 IP 地址,本身就是通过 NAT 方式映射到了绑定的云主机上,所以不能将 EIP 当作 VIP 绑定端口。这里就直接将内网 IP 当作 DIP 使用。
- ipvsadm -A -t 10.23.21.184:8000 -s rr
配置路由入口规则,使用 -a 参数
- ipvsadm -a -t 10.23.21.184:8000 -r 10.23.190.76:80 -m
- ipvsadm -a -t 10.23.21.184:8000 -r 10.23.122.152:80 -m
验证配置
- ipvsadm -ln
- ipvsadm -ln
开启路由转发
- echo 1 >/proc/sys/net/ipv4/ip_forward
这里大概解释下对 ipvsadm 的配置信息
- -A 添加一条新的虚拟服务器记录,即添加一台新的虚拟服务器</td>
- -a 添加一条新的真实服务器记录,即在虚拟服务器中添加一台真实服务器
- -t 真实服务器提供的是 TCP 服务
- -s 负载均衡使用的调度算法,rr 表示轮询
- -w 设置权重
- -r 指定真实服务器
- -m 指定 LVS 使用 NAT 模式
- -g 指定 LVS 使用 DR 模式
- -i 指定 LVS 使用 TUNNEL 模式
可以看到,我们配置的是使用 NAT 模式,调度算法为轮询。
到这里我们的配置就全部完成了,接下来让我们验证一下 LB01 能不能按照预期负载到 RS01、RS02 。使用浏览器直接打开 LB01 的外网 IP 地址。
<center><img src="https://files.mdnice.com/user/49675/3fec5550-ea08-4134-a311-c519174353f0.png" ></center> | <center><img src="https://files.mdnice.com/user/49675/ff589414-22f7-460f-9d60-5a4ecf086ccc.png" ></center> |
由于浏览器的缓存机制,在短时间内刷新的时候,返回可能不会发生变化。可以使用 curl 更准确的查看。
验证成功~
TUNNEL 模式实操
回顾一下 TUNNEL 模式的特点
- TUNNEL 模式不改变原数据包,而是在原数据包上新增一层 IP 首部信息。所以 TUNNEl 模式不支持对端口的转换,且真实服务器必须能够支持解析两层 IP 首部信息
- 真实服务器和负载均衡器可以不在同一个网段中
- 真实服务器需要更改 ARP 协议,“隐藏” lo 接口上的 VIP
TUNNEL 模式和其他模式有点不同,不能像之前那样直接使用 VIP 来充当 DIP。所以我们需要额外一个 DIP:10.23.21.180。
开始配置具体的负载规则~
RS01、RS02
安装 ipip 模块
- modprobe ipip
验证 ipip 模块是否加载成功
lsmod | grep ipip
- 修改 ARP 协议
- echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
- echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
- echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
rp_filter 表示是否开启对数据包源地址的校验,这里我们直接关闭校验即可。
- echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
- echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
- 配置 DIP
- ifconfig tunl0 10.23.21.180 broadcast 10.23.21.180 netmask 255.255.255.255 up
- route add -host 10.23.21.180 tunl0
- 验证配置
- ifconfig

- route -n

LB01
配置路由入口规则
- ipvsadm -A -t 10.23.21.180:80 -s wrr
配置路由出口规则,由于在不同的网段,这里需要配置 RS01、RS02 的外网地址
- ipvsadm -a -t 10.23.21.180:80 -r 10.23.190.76 -i -w 1
- ipvsadm -a -t 10.23.21.180:80 -r 10.23.122.152 -i -w 1
配置 DIP
安装 ipip 模块
- modprobe ipip
- ifconfig tunl0 10.23.21.180 broadcast 10.23.21.180 netmask 255.255.255.255 up
- route add -host 10.23.21.180 tunl0
验证配置
- ipvsadm -ln
- route -n
- ipvsadm -ln
配置完成,我们再申请一台云主机来验证实操结果。
DIP 是我们虚拟出来的 IP 地址,所以实际在网络中是找不到的,我们需要先手动将访问 DIP 的路由,访问到 LB01 上。
- route add -host 10.23.21.180 gw 10.23.21.184
验证一下
- route -n
- route -n
现在让我们来验证一下 TUNNEL 模型是否成功。
验证成功~
下篇继续 DR 模型的实操,及使用 Keepalived 实现 DR 模型的高可用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。