LVS集群部署

1. ipvs集群服务的特点

  • 一个ipvs主机可以同时定义多个cluster service,即可以同时负载均衡多个服务
  • 定义时指明lvs-type(lvs的模式)以及lvs scheduler(调度器)
  • 一个cluster service上至少应该有两个real server

环境说明

服务器类型

IP地址

系统版本

DR

192.168.200.145

centos 8

RS1

192.168.200.150

centos 8

RS2

192.168.200.151

centos 8

2. LVS-NAT部署

  • 需求:实现httpd服务的http和https的负载均衡
2.1先下载所需要的安装包
[root@DR ~]# yum -y install epel-release     //在DR1上下载
[root@DR ~]# yum -y install vim net-tools ipvsadm

[root@RS1 ~]# yum -y install httpd net-tools  //在RS1上下载


[root@RS2 ~]# yum -y install httpd net-tools  //在RS2上下载
2.2 DR要配置2块网卡,分别配置DIP和VIP
//这里可以直接修改网卡的配置文件,添加一个IP地址即可
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.200.145    //本机IP为DIP
PREFIX0=24
GATEWAY0=192.168.200.2
IPADDR1=192.168.200.100    //新添加的IP为VIP,实际情况中VIP应该为公网IP
PREFIX1=24


//重启网卡,让配置生效
[root@DR ~]# ifdown ens33;ifup ens33
2.3 RS1需要配置RIP
[root@RS1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.150
PREFIX=24
GATEWAY=192.168.200.145   //这里网关要指向DR的DIP
//重启网卡,让配置生效
[root@rs1 ~]# ifdown ens33;ifup ens33
[root@RS1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.200.145 0.0.0.0         UG    100    0        0 ens33
192.168.200.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.4 RS2需要配置RIP
[root@RS2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.151
PREFIX=24
GATEWAY=192.168.200.145

[root@RS2 ~]# 
[root@rs1 ~]# ifdown ens33;ifup ens33
[root@RS2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.200.145 0.0.0.0         UG    100    0        0 ens33
192.168.200.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
[root@RS2 ~]#
2.5 开启DR的ip转发功能
//在配置文件中追加以下内容
[root@DR ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

//重读配置
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
2.6在Director上添加并保存规则
//添加调度器
[root@DR ~]# ipvsadm -A -t 192.168.200.100:80 -s rr
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.200.100:80 rr



//添加RS至调度器
[root@DR ~]# ipvsadm -a -t 192.168.200.100:80 -r 192.168.200.150:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.200.100:80 -r 192.168.200.151:80 -m
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.200.100:80 rr
  -> 192.168.200.150:80           Masq    1      0          0         
  -> 192.168.200.151:80           Masq    1      0          0       
  
  
//保存配置
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@Director ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.200.100:80 -s rr
-a -t 192.168.200.100:80 -r 192.168.200.150:80 -m -w 1
-a -t 192.168.200.100:80 -r 192.168.200.151:80 -m -w 1
2.7 配置RS1和RS2的httpd服务
[root@rs1 ~]# echo "RS1" > /var/www/html/index.html
[root@rs2 ~]# echo "RS2" > /var/www/html/index.html
2.8关闭三台主机防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0

后面两台主机操作一样,略...
2.9 测试
[root@DR ~]# curl http://192.168.200.100
RS2
[root@DR ~]# curl http://192.168.200.100
RS1
[root@DR ~]# curl http://192.168.200.100
RS2
[root@DR ~]# curl http://192.168.200.100
RS1
[root@DR ~]#
2.9.1 完整的设置ipvsadm规则,使其重启服务器时服务不会丢失
// 先将ipvsadm规则保存到其他地方
ipvsadm -Sn > /data/ipvs.log    //位置随便定义

// 启动服务
[root@DR ~]# systemctl start ipvsadm

// 将服务设置为开机自启动
[root@DR ~]# systemctl enable --now ipvsadm
[root@DR ~]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor pre>
   Active: active (exited) since Mon 2021-10-18 21:36:18 EDT; 17min ago
  Process: 970 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconf>
 Main PID: 970 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 49290)
   Memory: 0B
   CGroup: /system.slice/ipvsadm.service

// 重启、测试服务还是启动的,调度也正常
[root@DR ~]# reboot
[root@DR ~]# systemctl stop --now firewalld
[root@DR ~]# curl http://192.168.200.100
192.168.200.151
[root@DR ~]# curl http://192.168.200.100
192.168.200.150

3. LVS-DR部署

  • 实现httpd服务的http和https的负载均衡
3.1 DR要配置2块网卡,分别配置DIP和VIP
//配置director的ip地址信息(dip,vip)
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.200.145    //本机IP为DIP
PREFIX0=24
GATEWAY0=192.168.200.2
IPADDR1=192.168.200.100    //新添加的IP为VIP,实际情况中VIP应该为公网IP
PREFIX1=24

[root@DR ~]# ifdown ens33;ifup ens33
3.2 修改网卡内核参数
[root@RS1 ~]# vim /etc/sysctl.conf  //添加以下内核参数
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p      //重新读配置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# 


[root@RS2 ~]# vim /etc/sysctl.conf  //添加以下内核参数
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]# sysctl -p      //重新读配置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]#
3.3 RS1和RS2需要配置RIP

注意:此处必须先修改网卡内核参数然后再配置vip,因为如果先配vip,vip配好后就会立马通告给别人,而修改内核参数就是为了不通告

[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.200.150
PREFIX0=24
GATEWAY0=192.168.200.2     //注意这里的网关就不能指向DR了
IPADDR1=192.168.200.100
PREFIX1=24

[root@RS1 ~]# ifdown ens33;ifup ens33   //重启网卡
成功停用连接 "ens33"(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[root@RS1 ~]# 


[root@RS2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.200.151
PREFIX0=24
GATEWAY0=192.168.200.2    //这里也一样把网关改回来
IPADDR1=192.168.200.100
PREFIX1=24

[root@RS2 ~]# ifdown ens33;ifup ens33   //重启网卡
成功停用连接 "ens33"(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[root@RS2 ~]#
3.4 在DR上添加并保存规则
[root@DR ~]# ipvsadm -A -t 192.168.200.100:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.200.100:80 -r 192.168.200.150:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.200.100:80 -r 192.168.200.151:80 -g
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.200.100:80 rr
  -> 192.168.200.150:80           Masq    1      0          0         
  -> 192.168.200.151:80           Masq    1      0          0         


//保存配置
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.200.100:80 -s rr
-a -t 192.168.200.100:80 -r 192.168.200.150:80 -g -w 1
-a -t 192.168.200.100:80 -r 192.168.200.151:80 -g -w 1
3.5测试
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# curl http://192.168.200.100
RS2
[root@DR ~]# curl http://192.168.200.100
RS1
[root@DR ~]# curl http://192.168.200.100
RS2
[root@DR ~]# curl http://192.168.200.100
RS1

3.6 完整的设置ipvsadm规则,使其重启服务器时服务不会丢失

3.6.1设置ipvsadm开机自启
// 先将ipvsadm规则保存到其他地方
ipvsadm -Sn > /data/ipvs.log    //位置随便定义

// 启动服务
[root@DR ~]# systemctl start ipvsadm

// 将服务设置为开机自启动
[root@DR ~]# systemctl enable --now ipvsadm
[root@DR ~]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor pre>
   Active: active (exited) since Mon 2021-10-18 21:36:18 EDT; 17min ago
  Process: 970 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconf>
 Main PID: 970 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 49290)
   Memory: 0B
   CGroup: /system.slice/ipvsadm.service

// 重启、测试服务还是启动的,调度也正常
[root@DR ~]# reboot
[root@DR ~]# systemctl stop --now firewalld
[root@DR ~]# curl http://192.168.200.100
192.168.25.150
[root@DR ~]# curl http://192.168.200.100
192.168.25.151
3.6.2 将命令加入到启动文件/etc/rc.d/rc.local
[root@DR ~]# vim /etc/rc.d/rc.local 
# that this script will be executed during boot.

touch /var/lock/subsys/local
ipvsadm -A -t 192.168.200.100:80 -s rr
ipvsadm -a -t 192.168.200.100:80 -r 192.168.200.150:80 -g
ipvsadm -a -t 192.168.200.100:80 -r 192.168.200.151:80 -g
ipvsadm -Sn > /etc/sysconfig/ipvsadm

// 给/etc/rc.d/rc.local执行权限
[root@DR ~]# chmod +x /etc/rc.d/rc.local 
[root@DR ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 660 10月 21 40:23 /etc/rc.d/rc.local