LVS+Keepalived 负载均衡配置.note

noteId: CAAE8AD9F51D41BE9C4D19E476962F2F · 原始路径:/ALL/Linux - A模块/服务配置/LVS、LVS + Keepalived 高可用代理(四层TCP代理)/LVS+Keepalived 负载均衡配置.note · 图片:36 · 附件待处理:0

 
·为什么需要Keepalived(有Keepalived和无Keepalived的区别):
因为单独配置LVS时,ipvsadm无法检测无法检测到后端服务器是否宕机,若是后端服务器故障,lvs无法感知,仍然会将数据包发送给故障的服务器,这样就导致客户端访问有概率丢包,因此就需要使用 lvs + keepalived 来感知后端服务器是否正常运行
 
·DR(直接路由模式)和 NAT(网络地址转换模式)的区别:
简单说明:
NAT模式下,LVS必须作为网关,因为流量回客户端必须经过LVS(除非使用策略路由,让回客户端的流量走lvs,其他流量走网关)
DR模式下,LVS不能够作为网关,且必须与后端服务器同网段
1、NAT 网络地址转换模式,数据包的转发到Web服务器,和数据包发送回Client客户端,都需要经过 LVS服务器(配置较为简单)
 
2、DR 直接路由模式,数据包只有转发到Web服务器时,需要经过 LVS-Keepalived服务器,后端服务器回包时,直接将数据发给客户端,无需经过LVS服务器,降低了LVS的压力(配置较为复杂,因为需要解决ARP问题)
注意:DR模式限制 后端服务器 与 LVS服务器 网络必须在同一网段内,并且还需要解决ARP问题(NAT模式就没有这个限制)
 
 
一、(http)NAT 模式:
NAT模式下,LVS必须作为网关,因为流量回客户端必须经过LVS(除非在Web上使用策略路由,让回客户端的流量走lvs,其他流量走网关)
 
·环境:
# 架构:
Client:1.1.1.1(GW=none) → Router(Keepalived+LVS):192.168.10.254(VIP:1.1.1.100)
             |
             +-- Web1: 192.168.10.1 (GW=192.168.10.254)
             +-- Web2: 192.168.10.2 (GW=192.168.10.254)
 
(1)关闭前面的 ipvsadm 配置(如果没有配置可以跳过该步骤):
vim /etc/default/ipvsadm
systemctl restart ipvsadm
systemctl stop ipvsadm
systemctl disable ipvsadm
# 改为 false 即可
 
 
如果没有配置ipvsadm可以忽略该步骤
 
(2)配置 Keepalived:
apt install -y keepalived
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
vim keepalived.conf
# 配置文件中默认有模板,更改内容即可:
先定义VIP(常规keepalived的配置):
 
然后开启 LVS 功能:
有时 80端口会被用来重定向到443,那么我们这里的 status_code 就需要写301,因为访问80端口时的返回码是301(反正用curl访问,它返回什么,status_code就写什么就行了),如果后端有身份认证,那么这里的status_code就需要写401
 
 
然后注释其他全部 LVS的配置(会产生一些干扰)
 
 
(3)(关键)我们还需要解决一个问题(13.2版本遇到的):
当然直接把 global_defs 这里全部注释掉也是可以的,这样就不会有这个问题了
# 重启服务后,keepalived会自动创建nftables规则,拒绝访问 VIP,这会导致 DR模式下 LVS无法正常工作
vim keepalived.conf
注释 vrrp_strict,否则每次重启都会自动生成下面的防火墙规则导致 VIP无法访问:
 
systemctl restart keepalived
 
 
·客户端访问:
在NAT模式下,客户端必须访问LVS的VIP才会被成功代理:
 
假如我访问LVS的其他IP,是不会被代理的:
 
·如果要配置防火墙规则:
LVS本地防火墙:
需要放行 input dport 流量 和
forward sport 流量
 
 
二、(http)DR 模式 :
 
配置文件中有默认模板
DR模式下,LVS不能够作为网关,且必须与后端服务器同网段
 
·环境:
# 架构:
Client → Router 
             |
             +-- Keepalived+LVS(Master): 192.168.10.10 (GW=192.168.10.254)(VIP:192.168.10.100)
             +-- Keepalived+LVS(Backup): 192.168.10.11 (GW=192.168.10.254)(VIP:192.168.10.100)(也可以无需Backup,单挂一台Master也可行)
             +-- Web1: 192.168.10.1 (GW=192.168.10.254)
             +-- Web2: 192.168.10.2 (GW=192.168.10.254)
 
1、配置 LVS:
 
(1)关闭前面的 ipvsadm 配置(如果没有配置可以跳过该步骤):
vim /etc/default/ipvsadm
systemctl restart ipvsadm
systemctl stop ipvsadm
systemctl disable ipvsadm
# 改为 false 即可
 
 
如果没有配置ipvsadm可以忽略该步骤
 
 
(2)配置 Keepalived:
apt install -y keepalived
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
vim keepalived.conf
# 配置文件中默认有模板,更改内容即可:
先定义VIP(常规keepalived的配置):
写成 192.168.10.100/24 也是可以的
 
然后开启 LVS 功能:
# 部分参数解析:
persistence_timeout 50    //同一个Client在50秒内始终调度到同一台后端服务器
sorry_server    //所有 real_server 都被判定为 DOWN后 才使用它
有时 80端口会被用来重定向到443,那么我们这里的 status_code 就需要写301,因为访问80端口时的返回码是301(反正用curl访问,它返回什么,status_code就写什么就行了),如果后端有身份认证,那么这里的status_code就需要写401
设置第二台后端服务器(一张图截不下):
 
然后注释其他全部 LVS的配置(会产生一些干扰)
 
 
(3)(关键)我们还需要解决一个问题(13.2版本遇到的):
# 重启服务后,keepalived会自动创建nftables规则,拒绝访问 VIP,这会导致 DR模式下 LVS无法正常工作
vim keepalived.conf
注释 vrrp_strict,否则每次重启都会自动生成下面的防火墙规则导致 VIP无法访问:
 
 
(4)配置 备份端Keepalived(如果有):
调低 keepalived 的优先级和模式为 Backup即可,操作这里不赘述
 
 
 
2、在路由器上配置DNAT:
vim /etc/nftables.conf
 
 
3、配置 防火墙规则(在 后端服务器上):
因为LVS DR模式不会修改数据包,直接将数据包发送给后端服务器,此时该数据包的目标地址还是 LVS的IP地址,因此后端服务器不会接受该数据包,因此我们需要使用防火墙,匹配目标地址为 LVS IP地址的数据包,使用REDIRECT重定向到本机,强制本机接收它
# iptables:
iptables -t nat -A PREROUTING -d 192.168.10.100 -p tcp --dport 80 -j REDIRECT
 
# nftables:
vim /etc/nftables.conf
 
 
·客户端 进行访问:
客户端必须访问LVS的VIP才会被成功代理:
 
·如果要配置防火墙规则:
只需要 放行 INPUT 的流量
 
三、(https)DR 模式:
配置文件中默认有模板
 
 
1、配置 LVS:
与前面的配置是一样的,只不过将80端口改为 443,访问方式由 HTTP_GET 改为 SSL_GET
vim /etc/keepalived/keepalived.conf
 
·重启服务:
systemctl restart keepalived
 
2、配置 备份端Keepalived(如果有):
调低 keepalived 的优先级和模式为 Backup即可,操作这里不赘述
 
 
3、客户端测试:
 
 
 
四、(http)TUN 模式:
注意,LVS需要开启路由功能
 
LVS 的IP直接用keepalived生成出来
 
·拓扑:
Web1:192.168.10.1
Web2:192.168.10.2
LVS1:192.168.10.252(VIP:192.168.10.254);1.1.1.252(VIP:1.1.1.100)
LVS2:192.168.10.253(VIP:192.168.10.254);1.1.1.252(VIP:1.1.1.100)
Client1:1.1.1.1
 
 
1、配置 lvs:
 
1)加载模块:
# 加载模块:
modprobe ip_vs
modprobe ip_vs_rr
modprobe ipip    //加载模块后,就会出现tunl0接口
 
# 持久化模块(重启不失效)
vim /etc/modules-load.d/modules.conf
 
2)配置 接收LVS-TUN 流量:
# 配置 接收 LVS-TUN 流量:
vim /etc/sysctl.d/route.conf
 
3)配置 keepalived:
apt install -y keepalived
 
有时 80端口会被用来重定向到443,那么我们这里的 status_code 就需要写301,因为访问80端口时的返回码是301(反正用curl访问,它返回什么,status_code就写什么就行了),如果后端有身份认证,那么这里的status_code就需要写401
 
 
 
2、配置 后端服务器(Real Server):
两台后端配置一样
 
1)加载模块:
modprobe ipip
vim /etc/modules-load.d/modules.conf
 
2)为 tunl0接口配置IP(IP需要与LVS IP一致):
# 配置接口IP
ip link set tunl0 up
ip addr replace 1.1.1.100/32 dev tunl0    //添加VIP地址
 
# 因为上面的的命令都是单次的,因此我们可以将它写入 /etc/netowrk/interfaces 文件中:
vim /etc/network/interfaces
 
3)配置 arp 忽略:
# 配置 arp忽略:
vim /etc/sysctl.d/route.conf
实际测试下来只需要一条:
 
 
·如果配置了防火墙,要放行 protocol 4:
不需要在 lvs 上放行,需要在 real server的input,和 real server 与 lvs 之间的链路上放行(假设lvs和real server之间有防火墙,就需要在forward上放行)
ip protocol 4 accept
 
·lvs 本机防火墙还需要放行 sport:
因为客户端收到ipip封装的包后,会回一个包给 lvs director设备,因此要 forward 需要放行 sport 80、443