一、LVS的運行原理
1.1 LVS簡介
LVS:Linux Virtual Server,負載調度器,內核集成,章文嵩,阿里的四層SLB(Server LoadBalance)是基于LVS+keepalived實現
LVS 官網: http://www.linuxvirtualserver.org/
LVS 相關術語
- VS: Virtual Server,負責調度
- RS:RealServer,負責真正提供服務
1.2?LVS概念
- VS:Virtual Server
- RS:Real Server
- CIP:Client IP
- VIP: Virtual serve IP VS外網的IP
- DIP: Director IP VS內網的IP
- RIP: Real server IP
訪問流程:CIP <--> VIP == DIP <--> RIP
1.3?lvs集群的類型
- lvs-nat: 修改請求報文的目標IP,多目標IP的DNAT
- lvs-dr: 操縱封裝新的MAC地址
- lvs-tun: 在原請求IP報文之外新加一個IP首部
- lvs-fullnat: 修改請求報文的源和目標IP
1.4?nat模式
Ivs-nat:
- 本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發
- RIP和DIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIP
- 請求報文和響應報文都必須經由Director轉發,Director易于成為系統瓶頸
- 支持端口映射,可修改請求報文的目標PORT
- VS必須是Linux系統,RS可以是任意OS系統
1.4.1?nat模式數據邏輯
- 客戶端發送訪問請求,請求數據包中含有請求來源(cip),訪問目標地址(VIP)訪問目標端口 (9000port)
- VS服務器接收到訪問請求做DNAT把請求數據包中的目的地由VIP換成RS的RIP和相應端口
- RS1相應請求,發送響應數據包,包中的相應保溫為數據來源(RIP1)響應目標(CIP)相應端口 (9000port)
- VS服務器接收到響應數據包,改變包中的數據來源(RIP1-->VIP),響應目標端口(9000-->80)
- VS服務器把修改過報文的響應數據包回傳給客戶端
- lvs的NAT模式接收和返回客戶端數據包時都要經過lvs的調度機,所以lvs的調度機容易阻塞
客戶請求到達vip后進入PREROUTING,在沒有ipvs的時候因該進入本機INPUT,當IPVS存在后訪問請求在通過PREROUTING后被ipvs結果并作nat轉發
因為ipvs的作用點是在PREROUTING和INPUT鏈之間,所以如果在prerouting中設定規則會干擾ipvs的工作。所以在做lvs時要把iptables的火墻策略全清理掉。
?1.5?DR模式
DR:Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
1.5.1?DR模式數據邏輯

在DR模式中,RS接收到訪問請求后不需要回傳給VS調度器,直接把回傳數據發送給client,所以RS和vs上都要有vip
1.5.2?DR模式數據傳輸過程
- 客戶端發送數據幀給vs調度主機幀中內容為客戶端IP+客戶端的MAC+VIP+VIP的MAC
- VS調度主機接收到數據幀后把幀中的VIP的MAC該為RS1的MAC,此時幀中的數據為客戶端IP+客戶端的MAC+VIP+RS1的MAC
- RS1得到2中的數據包做出響應回傳數據包,數據包中的內容為VIP+RS1的MAC+客戶端IP+客戶端IP的MAC
?1.5.3?DR模式的特點
- Director和各RS都配置有VIP
- 確保前端路由器將目標IP為VIP的請求報文發往Director
- 在前端網關做靜態綁定VIP和Director的MAC地址
- RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;
- RIP的網關不能指向DIP,以確保響應報文不會經由Director
- RS和Director要在同一個物理網絡
- 請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client
- 不支持端口映射(端口不能修敗)
- RS可使用大多數OS系統
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
- 在RS上修改內核參數以限制arp通告及應答級別
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
1.6?TUN模式(了解)
1.7?fullnet模式(了解)
二、環境準備
1.1 設備詳情
主機名 | 角色 | IP地址 | 網絡類型 |
client | 測試機 | 172.25.254.10 | NAT |
lvs | 調度器(VS) | 172.25.254.100,192.168.10.100 | NAT、僅主機 |
RS1 | 真實服務器(RS1) | 192.168.10.10 | 僅主機 |
RS2 | 真實服務器(RS2) | 192.168.10.20 | 僅主機 |
1.2 拓撲圖
三、配置步驟
2.1 本地yum倉庫配置
?2.2 關閉防火墻
所有的設備都關閉防火墻,或者放行80端口
2.3 設置網卡類型
主要是lvs網卡,需要兩張網卡,配置步驟如下:
2.4 快速修改網卡IP地址,主機名腳本
rhel9系列:
#!/bin/bash
ifconfig $1 &> /dev/null || {echo "net device $1 is not exist"exit
}
ping -c1 -w1 $2 &> /dev/null && {echo "$2 is exist"exit
}grubby --update-kernel ALL --args net.ifname=0
grubby --update-kernel ALL --args selinux=0grep $1 -r /etc/NetworkManager/system-connections/ | awk -F : '{system("rm -rf " $1)}'
cat >/etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1[ipv4]
method=manual
address1=$2/24,192.168.253.2
dns=8.8.8.8
EOF
chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1
hostnamectl hostname $3
grep -e "$2\t$3" /etc/hosts || {echo -e "$2\t$3" >>/etc/hosts
}
rhel7系列:
#!/bin/bash
ifconfig $1 &> /dev/null || {echo "net device $1 is not exist"exit
}
ping -c1 -w1 $2 &> /dev/null && {echo "$2 is exist"exit
}grubby --update-kernel ALL --args net.ifname=0
grubby --update-kernel ALL --args selinux=0grep $1 -r /etc/sysconfig/network-scripts/ | awk -F : '{system("rm -rf " $1)}'
cat >/etc/sysconfig/network-scripts/ifcfg-$1 <<EOF
DEVICE=$1
NAME=$1
BOOTPROTO=none
IPADDR0=$2
PREFIX0=24
GATEWAY0=192.168.253.2
DNS1=8.8.8.8
ONBOOT=yes
EOFnmcli connection reload
nmcli connection up $1
hostnamectl set-hostname $3
grep -e "$2\t$3" /etc/hosts || {echo -e "$2\t$3" >>/etc/hosts
}
2.5 使用腳本給每個設備修改IP地址和主機名
client:
lvs:
VIP:
CIP:
RS1:
RS2:
2.6 網關配置,并檢驗路由
rhel9網卡配置文件
client:
lvs:
RS1:
圖中筆誤,應該為DIP
RS2:
圖中筆誤,應該為DIP
2.7 LVS設備開啟內部網卡路由策略
2.8 LVS安裝ipvsadm包、配置策略
如果想要開機自啟達到話,配置下面的命令?
2.9 效果
四、涉及到的知識點
3.1 lvs軟件相關信息
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 規則保存工具:/usr/sbin/ipvsadm-save
- 規則重載工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs調度規則文件:/etc/sysconfig/ipvsadm
3.2?ipvsadm命令
核心功能:
- 集群服務管理:增、刪、改
- 集群服務的RS管理:增、刪、改
- 查看
命令參數:
管理集群服務
ipvsadm -A|E -t(tcp)|u(udp)|f(防護墻標簽) \
service-address(集群地址) \
[-s scheduler(調度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags]ipvsadm -D -t|u|f service-address 刪除
ipvsadm –C 清空
ipvsadm –R 重載
ipvsadm -S [-n] 保存管理集群中的real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w
weight](權重)
ipvsadm -d -t|u|f service-address -r server-address 刪除RS
ipvsadm -L|l [options] 查看rs
ipvsadm -Z [-t|u|f service-address] 清楚計數器
3.3?lvs集群中的增刪改
①?管理集群服務中的增刪改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A #添加
-E #修改
-t #tcp服務
-u #udp服務
-s #指定調度算法,默認為WLC
-p #設置持久連接超時,持久連接可以理解為在同一個時間段同一個來源的請求調度到同一Realserver
-f #firewall mask 火墻標記,是一個數字#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000
#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000
#刪除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66
②?管理集群中RealServer的曾增刪改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]-a #添加realserver
-e #更改realserver
-t #tcp協議
-u #udp協議
-f #火墻 標簽
-r #realserver地址
-g #直連路由模式
-i #ipip隧道模式
-m #nat模式
-w #設定權重
-Z #清空計數器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :輸出速率信息#添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2
#更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1
#刪除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30[root@DR-server ~]# ipvsadm -Ln
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.100:80 0 0 0 0 0
-> 192.168.0.30:80 0 0 0 0 0
-> 192.168.0.40:80 0 0 0 0 0
[root@DR-server ~]# ipvsadm -C
[root@DR-server ~]# ipvsadm -Z -t 172.25.254.20:80
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.20:80 0 0 0 0 0
-> 192.168.0.30:80 0 0 0 0 0
-> 192.168.0.40:80 0 0 0 0 0