linux 之 LVS调度

 

一、 前言

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩(花名 正明), 阿里的四层SLB(Server
Load Balance)是基于LVS+keepalived实现
LVS 官网:http://www.linuxvirtualserver.org/
阿里SLB和LVS:
https://yq.aliyun.com/articles/1803
https://github.com/alibaba/LVS
二、LVS工作原理
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核
级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”
范例:查看内核支持LVS
[root@centos7 ~]#grep -i -C 10 ipvs /boot/config-4.18.0-147.el8.x86_64

三、LVS集群中的术语

VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)
CIP:Client IP
VIP:Virtual serve IP VS外网的IP
DIP:Director IP VS内网的IP
RIP:Real server IP
访问流程:CIP <--> VIP == DIP <--> RIP

 四、简述lvs四种集群特点及使用场景

1)NAT转发模型

 

 

1. 客户端发起请求到load balancer的虚拟ip

2. load banlancer把客户请的目标地址改写为其中一个real server的,源地址改成不变。

3. realserver接受请求,并返回给load banlancer响应

4. load banlancer接受到响应,修改目标地址为不变,源地址改成自己的。

5. 客户端接受loader banlancer的响应

 

注意:

如果客户端和realserver在同一个网段,不会执行nat转换,realserver直接返回响应,客户端也会拒收此报文。

 

2)TUNNEL转发模型

 

 

1. 客户端发起请求到load balancer的虚拟ip

2. load banlancer把客户的请求包包裹,然后转发给其中的一个real server

3. realserver接受请求,解包。得到客户端发来的原始包。

4. realserver处理,把结果通过vip直接返回给客户端。

5. 客户端接受real server的响应。 

注意:

a. load balancerrealserver 直接通过ip tunnel技术重新封装、解包

b. load balancer和 realserver 使用相同的vip

c. load balnacerrealserver可以不再同一个网络

 

3)DR模型

 

 

1. 客户端发起请求到load balancer的虚拟ip
2. load banlancer把客户发送的包,修改源mac地址为vip的,目的mac地址为realserver的,然后发送给realserver
3. realserver接受请求,并处理,然后把结果通过vip直接返回给客户端。
4. 客户端接受real server的响应。 
注意
a. load balancer和 realserver 使用相同的vip
b. load balancerrealserver必须在同一个网络,因为load balancer需要知道realservermac地址。

4)LVS的FULLNAT模式

 

 

通过同时修改请求报文的源IP地址和目标IP地址进行转发NAT
 
fullnat模式特点:
1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向
DIP
2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3. 请求和响应报文都经由Director
4. 相对NATi模式,可以更好的实现LVS-RealServer间跨VLAN通讯
5. 支持端口映射
注意:此类型kernel默认不支持,
好了理论了解后我们进入实战部分,通过三个案例来练习

实战部分

实战一、实现LVS-NAT模式

1.网络拓扑图如下

 

 

根据网络拓扑我们准备4台机器
客户端:192.168.1.6
LVS服务器:eth1:192.168.1.8 eth0 10.0.0.8
两台RealServer 
RS1: 10.0.0.7
RS2:10.0.0.8

 

 从左到右配置细节如下

1.客户端配置如下

 

 

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.1.6
DEVICE="eth0"
ONBOOT="yes"

2.lvs服务器配置

网络配置

 

 

eth1
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.0.0.8
GATEWAY=10.0.0.2

DNS=223.6.6.6
PREFIX=24
DEVICE="eth0"
ONBOOT="yes"
       

 

 

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.1.8

PREFIX=24
DEVICE="eth1"
ONBOOT="yes"

开启路由转发功能

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

sysctl -p

 

LVS配置

1.yum install ipvsadm -y

[root@chujiapeng network-scripts]# rpm -ql ipvsadm
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm
/usr/sbin/ipvsadm-restore
/usr/sbin/ipvsadm-save
/usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz

配置lvs集群

[root@lvs ~]#ipvsadm -A -t 192.168.1.8:80 -s rr
[root@lvs ~]#ipvsadm -a -t 192.168.1.8:80 -r 10.0.0.7 -m
[root@lvs ~]#ipvsadm -a -t 192.168.1.8:80 -r 10.0.0.17 -m
[root@LVS ~]#ipvsadm -Ln

 

 RS服务器配置

 

 

RS1:10.0.0.7
TYPE="Ethernet" BOOTPROTO="static" IPADDR=10.0.0.7 PREFIX=24 DNS1=223.6.6.6 GATEWAY=10.0.0.8 NAME="eth0" DEVICE="eth0" ONBOOT="yes"

RS2:10.0.0.17

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.0.0.17
PREFIX=24
DNS1=223.6.6.6
GATEWAY=10.0.0.8
PEERDNS="yes"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"

 

配置http服务

[root@chujiapeng network-scripts]# yum install httpd;systemctl start httpd

编写测试脚本进行测试

[root@chujiapeng network-scripts]# while true ; do curl http://192.168.1.8/;sleep 1;done

 

 到此测试完成

实战二、描述LVS-DR工作原理,并配置实现。

LVS-DR模式单网段案例

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定
(2) 在各RS使用arptables
(3) 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
配置要点 
1. Director 服务器采用双IP桥接网络,一个是VIP,一个DIP
2. Web服务器采用和DIP相同的网段和Director连接 
3. 每个Web服务器配置VIP
4. 每个web服务器可以出外网 
网络拓扑图

 

 

环境:五台主机
一台:客户端 eth0:仅主机 192.168.0.6/24 GW:192.168.0.200
一台:ROUTER
eth0 :NAT  10.0.0.200/24
eth1: 仅主机 192.168.0.200/24
启用 IP_FORWARD
一台:LVS
eth0:NAT:DIP:10.0.0.8/24 GW:10.0.0.200
两台RS:
RS1:eth0:NAT:10.0.0.7/24   GW:10.0.0.200
RS2:eth0:NAT:10.0.0.17/24 GW:10.0.0.200

 

利用别名,快速的改网卡配置脚本
echo "alias eth='cd /etc/sysconfig/network-scripts/'" >>/root/.bashrc;
echo "alias netr='systemctl restart network'">>/root/.bashrc;
. /root/.bashrc;

1.根据拓扑图从左到右以此配置,首先配置客户端

 

 

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.0.6
GATEWAY=192.168.0.200
PREFIX=24
DEVICE="eth0"
ONBOOT="yes"

2.路由器配置

 

 

eth0
TYPE="Ethernet" BOOTPROTO="static" IPADDR=10.0.0.200 PREFIX=24 DEVICE="eth0" ONBOOT="yes"
==================================================
eth1

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.0.200


PREFIX=24
DEVICE="eth1"
ONBOOT="yes



开启路由转发功能
[root@chujiapeng network-scripts]# cat /etc/sysctl.conf 
net.ipv4.ip_forward = 1
sysctl -p

测试路由器

 

 3.RS配置

 

 

 

 

RS1

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.0.0.7
PREFIX=24
DNS1=223.6.6.6
GATEWAY=10.0.0.200
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"


RS2

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.0.0.17
PREFIX=24
DNS1=223.6.6.6
GATEWAY=10.0.0.200
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"

安装httpd服务器
[root@rs1 ~]#yum -y install httpd
[root@rs1 ~]#systemctl enable --now httpd 
[root@rs1 ~]#hostname -I > /var/www/html/index.html

[root@chujiapeng network-scripts]# curl 10.0.0.17
10.0.0.17

  

#LVS的网络配置

 

 

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
DEVICE="eth0"
ONBOOT="yes"

 

#RS1的IPVS配置
echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
[root@chujiapeng network-scripts]# echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
[root@chujiapeng network-scripts]# #echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce
[root@chujiapeng network-scripts]# #echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@chujiapeng network-scripts]# #echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce
[root@chujiapeng network-scripts]# ifconfig lo:1 10.0.0.100/32
[root@chujiapeng network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.0.0.100/0 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:c8:b7:0d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec8:b70d/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 52:54:00:fc:86:38 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
    link/ether 52:54:00:fc:86:38 brd ff:ff:ff:ff:ff:ff

同样配置rs2

[root@chujiapeng network-scripts]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@chujiapeng network-scripts]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@chujiapeng network-scripts]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@chujiapeng network-scripts]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@chujiapeng network-scripts]# ifconfig lo:1 10.0.0.100/32
[root@chujiapeng network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.100/0 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:58:e8:6f brd ff:ff:ff:ff:ff:ff
inet 10.0.0.17/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe58:e86f/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:fc:86:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:fc:86:38 brd ff:ff:ff:ff:ff:ff
[root@chujiapeng network-scripts]#



 

 
 
 
 LVS主机的配置
1.配置vip
ifconfig lo:1 10.0.0.100/32
2.安装软件

    [root@chujiapeng network-scripts]# yum install ipvsadm -y

3.集群配置

[root@chujiapeng network-scripts]# ipvsadm -A -t 10.0.0.100:80 -s rr
[root@chujiapeng network-scripts]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7:80 -g
[root@chujiapeng network-scripts]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17:80 -g
[root@chujiapeng network-scripts]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 rr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.17:80 Route 1 0 0




 

 

 编写测试脚本进行测试

while true ; do curl http://10.0.0.100/;sleep 1;done

 

 

 

 

 

 数据传输分析 过程

 

 

 

 

 

 

 

 第一个包

 

 

 

 

 

 

 第二个包

 

 

 

 

 第三个包

 

 

 

 

 

 第四个包

 

 

 

 

 第五个包

 

 

 

 

 第6个包

 

 

 

 

 

  第7个包

 

 

 

 

 

 

 

 

 第8个包

 

 

 

 

 

 

 到此整个请求过程的包 解析完毕

 

 

实战三、实现LVS+Keepalived高可用。

实验架构图

 

 

 

 

环境快速构建脚本
echo "alias netr='systemctl restart network'" >>~/.bashrc
echo "alias yum='yum install -y'" >>~/.bashrc
echo "alias eth='cd /etc/sysconfig/network-scripts/'" >>~/.bashrc
. ~/.bashrc

环境规划

 

 

 

 

 

第一个实验,实现LVS集群VIP漂移

 

 

 

 

 两台lvs服务器实现基于key 验证

 

 

 

 

 

 

 

 

 

 

 

 配置好之前抓包测试多播地址

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 keepalived 脚本配置,实现脚本通知功能

#!/bin/bash
#
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac

 

 

 

 

 

 

 

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost 
   }

   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id ka1 
   vrrp_mcast_group4 224.100.100.100
}


vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100/24 dev eth0 label eth0:1
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"    
}

下图是实现效果

 

 

 

 

 

 实现lvs的独立日志功能

 

 

 

 

 配置日志

 

 

 

 

 

 

 

 

 

 

 

 

 邮件通知邮箱演示

 

 

 

 

 

 配置新浪邮箱一直没成功,最后改成qq邮箱

 

 测试

 

 

 

 

 双主实现

 

 

 

 

 

 

 

 

 

 

 

 实现keepalived 的lvs 功能

 

 

 

 

 

 

 

 把37 服务断开 检查 切换

 

 

 

 

 

 到此 实验结束,实现了lvs的高可用

 

 

 

 

posted on 2021-04-17 14:05  jiapengchu  阅读(206)  评论(0编辑  收藏  举报

导航