LVS DR 模式
1.规划网络结构
角色 | 主机名 | 虚拟网卡网络模式 | VIP | 内网 IP 地址(een33) | 网关 |
---|---|---|---|---|---|
director lb | lvs | nat 模式 | 192.168.73.100 (ens33:0) | 192.168.73.129 | 192.168.73.2 |
real server1 | web1 | nat 模式 | 192.168.73.100 (lo:0) | 192.168.73.130 | 192.168.73.2 |
real server2 | web2 | nat 模式 | 192.168.73.100 (lo:0) | 192.168.73.131 | 192.168.73.2 |
2.lvs服务配置
#调整 proc 响应参数
#由于 LVS 负载调度器和各节点需要共用 VIP 地址,需要关闭 icmp 的重定向,不充当路由器。
[root@lvs ~]# vim /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
#为网卡ens33添加辅助IP
[root@lvs ~]# ifconfig ens33:0 192.168.73.100 netmask 255.255.255.255
#安装lvs核心管理软件包
[root@lvs ~]# yum install -y ipvsadm
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl restart ipvsadm.service
[root@lvs ~]# systemctl status ipvsadm.service
3.web服务器配置
#配置web01
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web01'> /usr/share/nginx/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01
#配置web02
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web02'> /usr/share/nginx/html/index.html
[root@web01 ~]# curl 127.0.0.1
web02
#web01和web02配置辅助ip,配置相同即可
#永久配置
#此地址仅用作发送 Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口 lo∶0 来承载 VIP 地址,并为本机添加一条路由记录,将访问 VIP 的数据限制在本地,以避免通信紊乱。
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
[root@web1 network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.73.100
NETMASK=255.255.255.255 #子网掩码必须全为1
[root@web1 ~]# systemctl restart network #添加完毕之后记得重启网卡生效
#如果没有ifconfig命令 下载net-tools包即可
[root@web1 ~]# ifup lo:0
[root@web1 ~]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.73.100 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@web1 ~]# route add -host 192.168.73.100 dev lo:0
#添加命令至/etc/rc.local
[root@web1 ~]# tail -1 /etc/rc.local
/sbin/route add -host 192.168.73.100 dev lo:0
#添加执行权限
[root@web01 ~]# chmod +x /etc/rc.d/rc.local
4.web服务器配置内核参数抑制 arp
修改内核参数开启arp抑制,ARP广播会产生的问题
- 当客户端发起访问VIP 对应的域名的请求(curl 192.168.152.100)时,根据网络通信原理会产生ARP 广播,因为负载均衡器dir和真实的服务器rs在同一网络并且VIP设置在集群中的每个节点上,此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIP的ARP广播,这就会产生问题,大家都说我是"VIP"。
- 为了达到负载均衡的目的,在所有real server上要关闭所有arp请求,导致不能响应client发出的arp请求(相当于哑巴),只有lvs可以响应,这样请求就会传到lvs的vip中,这就是为什么要禁止real server 的 arp请求和响应。因此必须想法办让真实服务器忽略来自客户端计算机的ARP广播请求 ——》 调整arp内核参数
#web01和web02配置相同
#调整内核的 ARP 响应参数以阻止更新 VIP 的 MAC 地址,避免发生冲突
[root@web1 ~]# tail -4 /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~]# sysctl -p
# 或者 修改proc 配置
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
ARP 响应行为和 ARP 解析行为内核参数:
- arp_annouce 定义通告级别
0:默认级别,将本地的任何接口上的配置的地址都在网络中通告
1:尽量避免向本主机上的其他网卡进行网络通信,特殊情况下其他接口也可以
2:总是使用最佳网络地址接口(仅使用定义的网卡接口在同网络通信)
- arp_ignore 定义响应级别(0-8九个级别),响应时忽略方式
0:都全都响应
1:只对从本接口进入的请求响应,且本接口地址是个网络地址
- 注释:一般使用arp_annouce=2,arp_ignore=1
5.lvs 配置负载规则
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -At 192.168.73.100:80 -s rr
[root@lvs ~]# ipvsadm -at 192.168.73.100:80 -r 192.168.73.129:80 -g
[root@lvs ~]# ipvsadm -at 192.168.73.100:80 -r 192.168.73.130:80 -g
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.73.100:80 rr
-> 192.168.73.129:80 Route 1 0 0
-> 192.168.73.130:80 Route 1 0 0
- -C --clear清除内核虚拟服务器表中的所有记录
- -A --add-service在内核的虚拟服务器表中添加一条新的虚拟服务器记录
- -t --tcp-service service-address说明虚拟服务器提供的是tcp 的服务
- -s --scheduler scheduler使用的调度算法,调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)
- -a --add-server在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
- -r --real-server server-address指定真实的服务器[Real-Server:port]
- -g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
- -L --list 显示内核虚拟服务器表
- -n 不解析端口使用的协议
6.测试验证
[root@lvs network-scripts]# curl 192.168.73.100
web02
[root@lvs network-scripts]# curl 192.168.73.100
web01