33_linux笔记-LVS

Posted cPen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了33_linux笔记-LVS相关的知识,希望对你有一定的参考价值。


最近在学习LVS,记录一下

介绍

LVS
        Linux Virtual Server        Linux虚拟主机 --> 是一个高可用高扩展的软件(负载均衡的软件)
        章文嵩是技术专家,也是LVS(Linux Virtual Server,Linux虚拟服务器)开源软件创始人
        2016年5月27日,章文嵩出任滴滴出行高级副总裁、负责CTO线基础平台部兼工程技术委员会主席
        linux内核里已经内置了lvs软件
        四层负载均衡

http://www.linuxvirtualserver.org/zh/
http://www.linuxvirtualserver.org/
http://www.linuxvirtualserver.org/zh/lvs3.html
https://zh.linuxvirtualserver.org/
http://www.linuxvirtualserver.org/zh/lvs4.html
https://blog.csdn.net/lcl_xiaowugui/article/details/81701949


架构

3种调度模式-架构(体系结构)

NAT
pic-01

修改目的ip和端口,不修改源ip、端口

TUN
pic-02
DR
pic-03


NAT

传统的nat
        DNAT
        缺点:解决不了real server在不同的网段
        调度器和real server都在同一个物理局域网里
        可以修改目的ip;可以修改目的端口

lvs NAT模式的实验
环境:
        1台调度器 --> 2块网卡
                ens33:192.168.0.73 --> wan
                ens37:192.168.31.10 --> lan
        2台real server
                server1:192.168.31.20
                server2:192.168.31.30
                server3:192.168.31.40

[root@LB ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.0.73
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=114.114.114.114
[root@LB ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens37
BOOTPROTO="none"
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.31.10
NETMASK=255.255.255.0

lvs已经安装到linux内核里了,不需要安装
ipvsadm 是一个给lvs软件传递参数和查看相关信息的工具
在调度器上安装ipvsadm这个工具

[root@LB ~]# yum install ipvsadm -y
[root@LB ~]# mkdir /lvs
[root@LB ~]# cd /lvs/
[root@LB lvs]# vim lvs_nat.sh
#!/bin/bash

# director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置SNAT策略,让内网的服务器可以上网
iptables -F
iptables -F -t nat
iptables -X -t nat      # 自定义规则链

iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -o ens33 -j SNAT --to-source 192.168.0.73
# 清空规则
/usr/sbin/ipvsadm -C
/usr/sbin/ipvsadm -A -t 192.168.0.73:80 -s wrr
/usr/sbin/ipvsadm -a -t 192.168.0.73:80 -r 192.168.31.20:80 -m -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.73:80 -r 192.168.31.30:80 -m -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.73:80 -r 192.168.31.40:80 -m -w 1

-C        清除规则
-A        添加vip和端口 --> 提供服务的ip地址和端口号
-t        tcp服务
-s --scheduler scheduling-method        指定调度的方法
        wrr 加权论询        weight round robin
-a        添加后端的上游(真实)服务器 Add a real server to a virtual service
-r --real-server server-address        指定real server
-m --masquerading Use masquerading(network access translation,or NAT)
-w --weight weight        权重值
-g --gatewaying Use gatewaying (direct routing). This is the default.

[root@LB lvs]# bash lvs_nat.sh 
[root@LB lvs]# iptables -L -t nat
……
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.31.0/24      anywhere             to:192.168.0.73
[root@LB lvs]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  LB:http wrr
  -> 192.168.31.20:http           Masq    1      0          0         
  -> 192.168.31.30:http           Masq    1      0          0         
  -> 192.168.31.40:http           Masq    1      0          0         

浏览器访问:192.168.0.73 负载均衡到后端real server

# 后端的real server知道外面访问的机器ip地址
[root@nginx-1 ~]# tail -f /usr/local/nginx/logs/access.log 
192.168.0.104 - - [04/Jul/2021:01:34:29 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/91.0.4472.124 Safari/537.36"

lvs做转发的时候,只修改了数据包里的目的ip,源ip没有动

keepalived + lvs --> NAT模式
keepalived可以直接通过配置文件对lvs进行配置了,不需要ipvsadm去手工配置

内网的real server的网关需要填lvs负载均衡器

[root@nginx-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.31.20
NETMASK=255.255.255.0
GATEWAY=192.168.31.10		#注:lvs负载均衡器的内网的ip
DNS1=114.114.114.114

fullNAT
        解决了real server可以在不同网络里(不同的vlan),不需要在同一个局域网的问题


DR

DR直接路由
LVS集群中的IP负载均衡技术 http://linuxvirtualserver.org/zh/lvs3.html
LVS之DR模式原理与实践 https://blog.51cto.com/u_13599730/2312603

负载均衡器:调度器、director、LB、load balancer、反向代理服务器
lvs的DR模式:通过直连路由实现虚拟服务器(VS/DR)
DR:direct route 直接路由
NAT:network address transfer

效果的问题:
        DR --> NAT --> FULLNAT

# 在dr上需要做的事情
1 .添加vip地址在ens33接口上
[root@LB lvs]# ip add add 192.168.0.88/24 dev ens33

2 .给lvs配置调度策略和real server的配置
[root@LB lvs]# vim lvs_dr.sh 
#!/bin/bash

# director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置SNAT策略,让内网的服务器可以上网
iptables -F -t nat
iptables -X -t nat
# 清空lvs里的规则
/usr/sbin/ipvsadm -c
# 添加lvs的规则
/usr/sbin/ipvsadm -A -t 192.168.0.88:80 -s wrr
/usr/sbin/ipvsadm -a -t 192.168.0.88:80 -r 192.168.0.20:80 -g -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.88:80 -r 192.168.0.30:80 -g -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.88:80 -r 192.168.0.40:80 -g -w 1
# -g	--gatewaying  Use gatewaying (direct routing). This is the default.	指定调度策略为DR模式

[root@LB lvs]# bash lvs_dr.sh 	# 执行脚本
[root@LB lvs]# ipvsadm			# 查看lvs的策略
# real server上的配置
1 .配置vip地址
	在lo接口上配置
[root@nginx-1 ~]# yum install net-tools -y
[root@nginx-1 ~]# ifconfig lo:0 192.168.0.88 netmask 255.255.255.255 broadcast 192.168.0.88 up
[root@nginx-1 ~]# /sbin/route add -host 192.168.0.88 dev lo:0
#注:就是告诉real server自己有192.168.0.188 vip地址 在lo:0这个接口上,而且告诉你如何到这个ip地址
[root@nginx-1 ~]# ip route
default via 192.168.31.10 dev ens33 proto static metric 100 
192.168.0.88 dev lo scope link src 192.168.0.88 

2 .禁止real server响应vip的arp广播,同时不向外宣告vip的mac地址 --> arp毒化
announce宣告
[root@nginx-1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore	#注:让ens33不要响应vip的arp广播 装聋
[root@nginx-1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@nginx-1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce	#注:装哑 不告诉其他的机器我的ip地址,不向外发arp广播,宣告自己ip地址对应的mac地址
[root@nginx-1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

3 .配置网关为路由器的lan口地址
	real server上配置网关为路由器的lan口地址
[root@nginx-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
BOOTPROTO="none" 
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.31.20
GATEWAY=192.168.31.10

Linux内核参数arp_ignore和arp_announce作用说明
        arp_ignore - INTEGER
        0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答
        1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应
        2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求
        3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
        4-7:保留
        8:不应答所有本地IP
        arp_announce - INTEGER
        0:默认值,允许使用本机上所有接口的IP作ARP通告
        1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告
        2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告


调度算法

8种调度算法
在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:
        轮叫调度(Round-Robin Scheduling)
        加权轮叫调度(Weighted Round-Robin Scheduling)
        最小连接调度(Least-Connection Scheduling)
        加权最小连接调度(Weighted Least-Connection Scheduling)
        基于局部性的最少链接(Locality-Based Least Connections Scheduling)
        带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
        目标地址散列调度(Destination Hashing Scheduling)
        源地址散列调度(Source Hashing Scheduling)


keepalived + nginx + lvs

方案1:
        高可用:keepalived
        负载均衡:nginx

方案2:
        高可用:keepalived
        负载均衡:lvs
        master和backup上都要开启路由功能
        real server需要填写2个默认网关

keepalived的配置文件里写好了给lvs传递的参数,不需要使用ipvsadm命令去传参

[root@LB-1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 158
    priority 180
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.188
    }
}

virtual_server 192.168.0.188 80 {	# 知道vip和对应的端口号
    delay_loop 6
    lb_algo rr		# load balancer algorithm 负载均衡的算法 rr 论询 wrr加权论询
    lb_kind NAT		# lvs负载均衡的模式是NAT
    persistence_timeout 50	# 连接超时的时间
    protocol TCP	# 支持的协议是tcp

    real_server 192.168.30.2 80 {	# 后端的real server的ip和端口
        weight 1	# 权重
    }
    real_server 192.168.30.3 80 {
        weight 1
    }
    real_server 192.168.30.4 80 {
        weight 1
    }
}

[root@LB-2 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 158
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.188
    }
}

virtual_server 192.168.0.188 80 {	# 知道vip和对应的端口号
    delay_loop 6
    lb_algo rr		# load balancer algorithm 负载均衡的算法 rr 论询 wrr加权论询
    lb_kind NAT		# lvs负载均衡的模式是NAT
    persistence_timeout 50	# 连接超时的时间
    protocol TCP	# 支持的协议是tcp

    real_server 192.168.30.2 80 {	# 后端的real server的ip和端口
        weight 1	# 权重
    }
    real_server 192.168.30.3 80 {
        weight 1
    }
    real_server 192.168.30.4 80 {
        weight 1
    }
}
[root@LB-1 ~]# service keepalived restart
[root@LB-1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  LB:http rr persistent 50
  -> 192.168.30.2:http            Masq    1      0          0         
  -> 192.168.30.3:http            Masq    1      0          0         
  -> 192.168.30.4:http            Masq    1      0          0       

Chrome浏览器访问 192.168.0.188        rr论询策略


以上是关于33_linux笔记-LVS的主要内容,如果未能解决你的问题,请参考以下文章

33_linux笔记-LVS

33_linux笔记-LVS

Linux系统LVS搭建笔记

Linux自学笔记——linux cluster 之lvs

lvs学习笔记

linux自学笔记--lvs和keepalived高可用基础