LVS(Linux Virtual Server)工作於核心空間的 NETFILTER HOOK,以 IPVS 模組實現四層負載均衡,效能遠超應用層方案(Nginx/HAProxy)。本文記錄在 CentOS 7.9 上從零構建 LVS Director 的完整流程:核心模組驗證、依賴解決、ipvsadm 編譯安裝、模組持久化與驗證。
Client → [VIP] → LVS Director (IPVS) → Real Server 1..N
↑
ipvsadm 管理工具
# 1. 確認核心已編入 IPVS(CentOS 7 內核 3.10 預設包含)
lsmod | grep -E 'ip_vs|nf_conntrack'
# 2. 若無,手動載入並持久化
modprobe -- ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4
cat > /etc/modules-load.d/ipvs.conf <<'EOF'
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOF
yum install -y kernel-devel-$(uname -r) gcc make libnl3-devel libnl3 popt-devel openssl-devel
# 驗證版本一致
rpm -q kernel-devel
# kernel-devel-3.10.0-1160.el7.x86_64
uname -r
# 3.10.0-1160.el7.x86_64 ← 必須完全一致
KVER=$(uname -r)
ln -sf /usr/src/kernels/${KVER} /usr/src/linux
ls -l /usr/src/linux
# lrwxrwxrwx 1 root root 38 Mar 20 10:00 /usr/src/linux -> /usr/src/kernels/3.10.0-1160.el7.x86_64
cd /usr/local/src
IPVSADM_VER=1.30 # 對應 kernel 3.10+
wget https://www.linuxvirtualserver.org/software/kernel-3.10/ipvsadm-${IPVSADM_VER}.tar.gz
tar xzf ipvsadm-${IPVSADM_VER}.tar.gz
cd ipvsadm-${IPVSADM_VER}
make -j$(nproc) && make install
# 安裝至 /usr/sbin/ipvsadm
ipvsadm --version
# ipvsadm v1.30 (2020-01-01), compiled with kernel 3.10.0-1160.el7.x86_64
ipvsadm -L -n
# IP Virtual Server version 1.2.1 (size=4096)
# Prot LocalAddress:Port Scheduler Flags
# -> RemoteAddress:Port Forward Weight ActiveConn InActConn
| 錯誤訊息 | 原因 | 解決 |
|---|---|---|
kernel source not found | kernel-devel 版本不符或未安裝 | yum install kernel-devel-$(uname -r) 並重建軟連結 |
libnl3 not found | 缺少 libnl3-devel | yum install libnl3-devel |
popt.h not found | 缺少 popt-devel | yum install popt-devel |
undefined reference to `ipvs_* | 核心未載入 IPVS 模組 | modprobe ip_vs 並加入 modules-load.d |
yum install ipvsadm 直接安裝 RPM(CentOS Base/Extras 源已收錄),僅在需最新版或特定 patch 時自行編譯sysctl -w net.ipv4.ip_forward=1、net.ipv4.vs.conntrack=1(需 nf_conntrack)ipvsadm -L --stats --rate --exact 觀察 InActConn、OutBytes、調度器佇列結語: LVS + Keepalived 是四層負載均衡的黃金組合,單 Director 處理 100k+ 連線輕輕鬆鬆。核心模組與 ipvsadm 版本對齊是安裝成功的關鍵——永遠先 uname -r 再 yum install kernel-devel-$(uname -r)。