深入浅出 LVS 负载均衡(三)实操 NAT、DR 模型

之前介绍了 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

做完这些前置准备工作之后,接下来对照 NAT 模式来配置具体的负载规则。
RS01、RS02
设置默认网关为 DIP,即 LB01 的内网 IP - 10.23.21.184
查看 RS01、RS02 当前的默认网关
route -n

可以看到当前的默认网关是 10.23.0.1
设置默认网关为 10.23.21.184
route add default gw 10.23.21.184
输入命令并按下回车之后,会很长时间没有响应,是正常的。等它连接断掉之后,再通过 LB01 登陆到 RS01、RS02 上


删除之前的默认网关
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

开启路由转发
echo 1 >/proc/sys/net/ipv4/ip_forward
这里大概解释下对 ipvsadm 的配置信息
📌-A 添加一条新的虚拟服务器记录,即添加一台新的虚拟服务器
-a 添加一条新的真实服务器记录,即在虚拟服务器中添加一台真实服务器
-t 真实服务器提供的是 TCP 服务
-s 负载均衡使用的调度算法,rr 表示轮询
-w 设置权重
-r 指定真实服务器
-m 指定 LVS 使用 NAT 模式
-g 指定 LVS 使用 DR 模式
-i 指定 LVS 使用 TUNNEL 模式
可以看到,配置使用 NAT 模式,调度算法为轮询 。
到这里配置就全部完成了,接下来验证一下 LB01 能不能按照预期负载到 RS01、RS02 。使用浏览器直接打开 LB01 的外网 IP 地址。


由于浏览器的缓存机制,在短时间内刷新的时候,返回可能不会发生变化。可以使用 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

配置完成,再申请一台云主机来验证实操结果。
DIP 是虚拟出来的 IP 地址,所以实际在网络中是找不到的,需要先手动将访问 DIP 的路由,访问到 LB01 上。
route add -host 10.23.21.180 gw 10.23.21.184
验证一下 route -n

现在来验证一下 TUNNEL 模型是否成功。

验证成功~
下篇继续 DR 模型的实操,及使用 Keepalived 实现 DR 模型的高可用。

版权声明: 本文为 InfoQ 作者【UCloud技术】的原创文章。
原文链接:【http://xie.infoq.cn/article/68014d9f3a2dbaed800dbb871】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论