【Linux-云原生-笔记】LVS(Linux virual server)相关
一、概念
LVS(Linux Virtual Server)是构建在 Linux 内核中的高性能、高可用性服务器负载均衡解决方案。它由章文嵩博士于 1998 年创建,现已成为 Linux 内核的标准模块(ip_vs
)。
二、实验
1、实验环境搭建
准备4台主机:
主机1
主机名:Client
网卡:NAT
ip:172.25.254.111/24
主机2
主机名:lvs
网卡1:NAT
网卡2:Host-only(仅主机)
ip:172.25.254.100/24(网卡1)
192.168.0.100/24(网卡2)
主机3
主机名:RS1
网卡:Host-only(仅主机)
ip:192.168.0.10/24
网关:192.168.0.100(主机lvs的ip)
主机4
主机名:RS2
网卡:Host-only(仅主机)
ip:192.168.0.20/24
网关:192.168.0.100(主机lvs的ip)
(1)RS1、RS2的设置:
设置完后,在RS1与2中dnf下载httpd服务,并设置:
并关闭RS1与2中的火墙:
systemctl disable --now firewalld.service
(2)lvs的设置:
设置其两个网卡互通:
sysctl -a | grep ip_forward
复制其弹出来的:net.ipv4.ip_forward = 0,待会粘贴到/etc/sysctl.conf里
vim /etc/sysctl.conf
(3)测试
在lvs上,curl一下RS1/2的ip:
curl 192.168.0.10
curl 192.168.0.20
出现我们设置的内容就成功
2、ipvsadm
ipvsadm
是 Linux Virtual Server (LVS) 的核心配置工具,用于管理 IPVS(IP Virtual Server)内核模块。
- 安装包:ipvsadm
- 服务名称:ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:/etc/sysconfig/ipvsadm
(1)安装
dnf安装
(2)ipvsadm的常用参数解释
1)功能参数:
命令 | 功能 | 示例 |
---|---|---|
-A | 添加虚拟服务 (VIP) | ipvsadm -A -t 192.168.1.100:80 -s rr |
-E | 编辑虚拟服务 | ipvsadm -E -t 192.168.1.100:80 -s wlc |
-D | 删除虚拟服务 | ipvsadm -D -t 192.168.1.100:80 |
-a | 添加真实服务器 (Real Server) | ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11 -g |
-e | 编辑真实服务器 | ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.11 -w 5 |
-d | 删除真实服务器 | ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.11 |
-C | 清空所有规则 | ipvsadm -C |
-L | 列出当前规则 | ipvsadm -Ln |
2)协议参数:
选项 | 协议 | 示例 |
---|---|---|
-t | TCP | -t 192.168.1.100:80 |
-u | UDP | -u 192.168.1.100:53 |
-f | Firewall Mark | -f 100 (用于端口组绑定) |
3)算法参数:
rr
:轮询 (Round Robin)wrr
:加权轮询 (Weighted RR)lc
:最小连接 (Least Connections)wlc
:加权最小连接 (Weighted LC)sh
:源地址哈希 (Source Hashing)dh
:目标地址哈希 (Destination Hashing)
4)工作模式参数:
选项 | 模式 | 说明 |
---|---|---|
-g | DR模式 | 直接路由 (默认) |
-i | TUN模式 | IP隧道 |
-m | NAT模式 | 网络地址转换 |
5)权重与连接参数:
选项 | 功能 | 示例 |
---|---|---|
-w [权重] | 设置服务器权重 | -r 192.168.1.11 -w 5 |
-x | 禁用服务器(权重=0) | -e -r 192.168.1.11 -x |
--connection | 显示活动连接数 | ipvsadm -L --stats |
(3)具体用法
为了方便查看和演示,我们先创建一个监视器:
多开一个窗口
解释:
- -n —— 不显示ip,而显示主机名
- -L —— 列出当前规则
创建完为这样:
下面开始用具体例子来解释各种参数的运用
解释:
- -A —— 添加
- -t —— tcp协议
- -s —— 调度类型为...
- rr —— 轮询
- 轮询 —— 简单来说就是你一个我一个,两个RS轮着来
监视器就出现了我们添加的这个
解释:
-E —— 更改
这条与上面就-A和-E的区别,之前的是添加,这个是修改,意思即为将rr调度改成wrr调度
执行后就能发现监视器的rr变成wrr了,更改成功
解释:
-p —— 延至,相当于延长
整体-p 360即为延至(延长)360秒,就好比:一个客户访问lvs后,lvs将其调度到RS1,之后如果这个客户再次来访问,那么,在360秒内,该客户还会被调度到RS1,只有360秒过了之后,才可能调度到别的RS
解释:
-f —— 火墙标记,标记为66(例子)
火墙标记的目的在于:将同一个ip但不同端口的访问流量打上同一个标记,就表示这两个相同ip不同端口的流量是同一个访问流量,为了就是避免lvs将两个流量都给一台RS处理,均衡负载
解释:
-D —— 删除,这里即为删除刚刚创建的火墙标记66
可以看到火墙标记没了
解释:
-C —— 全部删除
可以看到清空全部了
由于我们刚刚删了全部,现在加回来:
解释:
- -a —— 添加真实服务器 (Real Server)
- -r —— 指定哪个RS,这里即指定RS1(192.168.0.10:80)
- -m —— NAT模式
这里即为172.25.254.100:80指定RS1,nat模式
注意这次是添加RS2(192.168.0.20)
解释:
-g —— DR模式,直连路由模式
解释:
-e —— 修改real server
-i —— 隧道模式
即:将RS1的工作模式修改成IP隧道模式
解释:
-w —— 设定权重,这里权重设定为2
权重 ——
权重值 越高 的服务器,被分配到的请求越多
权重值 越低 的服务器,接收的请求越少
权重为 0 时,服务器不再接收新请求(但已有连接保持)
示例:三台服务器权重3:2:1
,请求分配比例 ≈50% : 33% : 17%
解释:
-Z —— 清空计数器
这些就是计数器(命令:watch -n1 ipvsadm -Ln --rate)
(4)策略保存
这样即保存策略
更加具体的保存:保存到.rule里
接下来我们来测试是否真的保存了:
删除现有策略
可以看到监视器已空
现在我们恢复:
监视器显示策略全部恢复
说明策略有保存到.rule里
(5)设定开机ipvsadm生效
保存到系统文件
再删一次策略
启动服务
这样就设置成功,开机时加载策略
(6)NAT模式的测试与过程解析
流程解析:
我们从Client端(172.25.254.111)访问我们的lvs(172.25.254.100),正常流程的话,lvs会把访问的流量交给RS1处理(因为先前设置过RS1的权重更高),然后RS1再将流量传回给lvs,然后lvs再传给Client,这样就完成了访问的一个流程
但如果不关闭lvs的防火墙,那么客户端Client访问是接收不到信息的:
for N in {1..6};do curl 172.25.254.100;done
就会卡在这里,但监视器上,是可以看到RS1的ActiveConn是有1的:
这说明访问的流量是过去了的,即流量是到了RS1的,可是Client访问却还是接收不到信息,那么这样的情况只有一种可能:那就是过去的流量过去了,但回来的流量却回不来
所以才导致Client访问却接收不到信息
那么造成这样的原因就是lvs的防火墙没关,防火墙将此流量拦截了,所以流量回不去,导致无法访问,所以我们关闭lvs上的防火墙即可
关闭lvs的防火墙
关完后,再访问一次,Client就能接受到信息了
测试成功
3、DR模式
LVS (Linux Virtual Server) 的 DR (Direct Routing) 模式。这是 LVS 实现负载均衡的三种主要转发模式(NAT、TUN、DR)之一,以其高性能和低资源消耗而著称,尤其适合处理高吞吐量的场景。
核心目标:
将客户端的请求高效地分发到后端的真实服务器(Real Server, RS)上,并将真实服务器的响应直接返回给客户端,而不经过负载均衡器(Director)。这极大地减轻了 Director 的负担。
DR 模式的核心原理:
DR 模式的核心在于巧妙地利用了以太网的 MAC 地址重写和 ARP 协议控制,实现了数据包的“三角传输”:
VIP (Virtual IP):
- 负载均衡集群对外提供服务的 IP 地址。所有客户端都访问这个 VIP。
- 这个 VIP 需要配置在 Director 的物理网卡(或 loopback 别名) 上,并且必须同时配置在每台 Real Server 的 loopback 接口的一个别名(如 lo:0) 上。
- 关键点: Real Server 上的 VIP 配置通常需要设置
arp_ignore
和arp_announce
参数,以防止它们响应客户端对 VIP 的 ARP 请求(详见下文“ARP 问题”)。
客户端请求到达:
客户端发送请求到 VIP(目标 IP = VIP)。
该请求通过网络到达 Director 所在的网络段(通常 Director 和 Real Server 在同一个二层广播域/VLAN 内)。
因为 VIP 配置在 Director 的物理接口上,Director 会接收到这个目标地址是 VIP 的请求包。
Director 处理请求(负载均衡 & MAC 重写):
Director 根据配置的负载均衡算法(如轮询 rr、加权轮询 wrr、最少连接 lc 等)从 Real Server 池中选择一台合适的服务器(RS)。
关键操作: Director 保持 IP 数据包不变(源 IP=Client IP, 目标 IP=VIP),但重写链路层(L2)的 MAC 地址:
将原始以太网帧的目标 MAC 地址(原本是 Director 自己的 MAC)替换为选中的 Real Server 的 MAC 地址。
源 MAC 地址改为 Director 的 MAC。
Director 将这个修改了 MAC 头的数据包直接发送到本地网络。
Real Server 接收并处理请求:
由于数据包的目标 MAC 地址是选中的 Real Server 的 MAC 地址,该 Real Server 的网卡会接收这个帧。
网络栈解封装到 IP 层,发现目标 IP 地址是 VIP。因为 VIP 配置在该 Real Server 的 loopback 别名(如 lo:0)上,操作系统认为这个包是发给自己的,于是将其传递给监听在 VIP 上的服务进程(如 Web 服务器)。
Real Server 处理请求(例如生成网页内容)。
Real Server 直接响应客户端:
这是 DR 模式性能高的关键!
Real Server 准备发送响应包:
源 IP = VIP (服务 IP)
目标 IP = 原始请求的源 IP (Client IP)
Real Server 的网络栈查询路由表。目标地址是 Client IP(通常不在本地网络),所以默认网关通常是 Director 或者路由器。
关键点: Real Server 不会将响应包发送给 Director(即使默认网关指向 Director)。因为它拥有 VIP(在 lo:0 上),它会直接将响应包从它的物理网卡发送出去。
响应包的目标 MAC 地址通过 ARP 查询 Client IP 对应的 MAC(如果 Client 不在同一网段,则查询默认网关的 MAC)。
响应包直接发送给客户端(或通过默认网关路由到客户端),完全绕过 Director。
(1)DR模式实验环境搭建
DR模式多加一台主机,其余的结构不咋变化
准备5台主机:
主机1
主机名:Client
网卡:NAT
ip:172.25.254.111/24
网关:172.25.254.100(router的ip)
主机2
主机名:router
网卡1:NAT
网卡2:Host-only(仅主机)
ip:172.25.254.100/24(网卡1)
192.168.0.100/24(网卡2)
主机3
主机名:RS1
网卡:Host-only(仅主机)
ip:192.168.0.10/24
网关:192.168.0.100(主机router的ip)
回环lo:
ip1:127.0.0.1/8
ip2:192.168.0.254/32
主机4
主机名:RS2
网卡:Host-only(仅主机)
ip:192.168.0.20/24
网关:192.168.0.100(主机router的ip)
回环lo:
ip1:127.0.0.1/8
ip2:192.168.0.220/32
主机5
主机名:DR-lvs
网卡:Host-only(仅主机)
ip1:192.168.0.200/24
ip2:192.168.0.254/24
网关:192.168.0.100(router的ip)
回环lo:
ip1:127.0.0.1/8
ip2:192.168.0.254/32
新加的主机5(DR-lvs)记得下载ipvsadm:
火墙情况:
Router的火墙开启
然后开启这个:
其余的主机火墙均关闭
(2)设置RS对外不响应
不响应解析:
因为lvs、RS1、RS2上都是192.168.0.220这个ip,所以流量可能直接从RS上返回,而不是从lvs返回,这样就会导致负载均衡用不上(或用不了),因为负载均衡是在lvs上做的,但流量却从RS上直接走了,所以需要在RS上设置对外不响应,让流量只能进不能出
RS2:
找打这几个:
echo写进系统文件
RS1 同理,同样的命令:
这样两个RS主机就设定了lo回环不对外响应
现在回router,-C清空所有
在DR-lvs设定新的
-Ln查看一下:
(3)在Client上测试:
访问成功
4、TUN隧道模式(了解即可)
(1)概念
Linux 的 TUN 隧道模式 是一种利用内核提供的虚拟网络设备 (tun
) 来实现网络数据包在用户空间程序和内核网络栈之间传输的机制。它的核心目的是让运行在用户空间的程序能够处理原始的 IP 层(网络层,OSI 第 3 层)数据包,从而实现各种网络功能,尤其是隧道和 VPN。
(2)运作原理
虚拟网络设备 (
tun
):Linux 内核提供了一种特殊类型的网络接口:
tun
(用于 IP 层) 和它的兄弟tap
(用于以太网层/L2)。tun
设备没有关联任何物理硬件。它是一个纯软件构造的接口。你可以像管理物理网卡 (如
eth0
) 一样使用ip
或ifconfig
命令来创建、配置、启用 (up
) 或禁用 (down
) 它,给它分配 IP 地址、设置路由等。
内核空间 ↔ 用户空间桥梁:
这是 TUN 模式的核心功能。
当一个程序(我们称之为隧道程序或用户空间程序,如 OpenVPN、WireGuard 的用户空间实现、sshuttle 等)打开
/dev/net/tun
设备文件并配置好一个tun
接口(通常通过ioctl
系统调用)后,它就获得了与该接口通信的通道。该程序可以读取 (
read()
) 从tun
接口出来的数据包。该程序可以写入 (
write()
) 数据包到tun
接口。
数据流向 (隧道模式 - 发送端):
应用程序产生数据: 本地主机上的某个应用程序(如浏览器)想要发送数据到远程服务器。它创建一个 TCP/UDP 数据包,目标 IP 是远程服务器的公网 IP。
内核路由决策: 内核根据路由表决定如何发送这个包。路由表被配置为:发往特定目标网络(通常是隧道另一端代表的网络)的数据包,其出口是
tunX
接口。包进入
tun
设备: 内核网络栈将这个原始的 IP 数据包(包含 IP 头、TCP/UDP 头、应用数据)发送到tunX
接口。用户空间程序读取: 隧道程序正在
read()
等待/dev/net/tun
。内核将这个完整的原始 IP 数据包传递给等待读取的隧道程序。
(3)核心特点总结:
IP 层操作: TUN 处理的是网络层 (L3) 的原始 IP 数据包。它不处理以太网帧头。
用户空间处理: 关键的数据包处理逻辑(封装/解封装、加密/解密)发生在用户空间的应用程序中,而不是内核模块里。这提供了极大的灵活性,开发者可以用任何语言编写隧道逻辑。
内核集成: 尽管处理在用户空间,
tun
设备让隧道程序无缝集成到内核的网络栈中。应用程序和内核的路由机制完全感知不到隧道程序的存在;它们只看到一个普通的网络接口 (tunX
)。隧道端点: 隧道的逻辑端点就是运行隧道程序的主机上的
tun
接口。隧道程序负责将进出这个接口的流量通过真实的物理网络传输到远程的隧道对等端。
5、火墙标记实验
(1)RS上安装mod_ssl
在RS1、2上
(2)lvs配置新调度策略
在lvs上:
先清除之前所有的调度策略
然后配置新的策略
[root@DR-lvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DR-lvs ~]# ipvsadm -A -t 192.168.0.220:443 -s rr
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10:80 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20:80 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.20:80 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.10:80 -g
新策略为rr轮询,设置RS1、2处理流量
查看为这样:
测试(Client端)
测试时发现两次调度都到了RS1上,不合理,没有良好负载均衡
(3)设置火墙标记
所以火墙标记出手了~
配置火墙策略并添加火墙标记
[root@DR-lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666[root@DR-lvs ~]# ipvsadm -A -f 6666 -s rr
[root@DR-lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@DR-lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
将这同源的两个端口号标记成同一个火墙标记6666, 这样lvs就能良好负载均衡了
查看一下:
火墙标记后,再测试(Client端)
[root@DR-lvs ~]# ipvsadm -E -f 6666 -s rr -p 3000
火墙标记后,调度就合理了,保持良好的负载均衡
6、火墙标记时间(lvs持久连接)
LVS(Linux Virtual Server)的持久连接(Persistent Connection) 是一种关键特性,用于解决在无状态负载均衡场景下,需要保持同一客户端会话连续访问同一台后端服务器(Real Server) 的问题。这在处理如 HTTPS 会话、SSL 握手、FTP 主动模式、数据库事务等有状态协议或应用时至关重要。
如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。
如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
(1)设置
[root@DR-lvs ~]# ipvsadm -E -f 6666 -s rr -p 3000
解释:
-p [TIMEOUT]
—— 启用持久连接并设置超时时间(秒)。TIMEOUT
是必填项
设置好后,再次去Client上测试一下先前的测试指令
然后就能够查看: