概念:
ipvs (IP Virtual Server) 實現了傳輸層負載均衡,也就是我們常說的4層LAN
交換,作為 Linux 內核的一部分。ipvs
運行在主機上,在真實服務器集群前充當負載均衡器。ipvs
可以將基於TCP
和UDP
的服務請求轉發到真實服務器上,並使真實服務器的服務在單個 IP 地址上顯示為虛擬服務。
ipvs vs. iptables
我們知道kube-proxy
支持 iptables 和 ipvs 兩種模式, 在kubernetes
v1.8 中引入了 ipvs 模式,在 v1.9 中處於 beta 階段,在 v1.11 中已經正式可用了。iptables 模式在 v1.1 中就添加支持了,從 v1.2 版本開始 iptables 就是 kube-proxy 默認的操作模式,ipvs 和 iptables 都是基於netfilter
的,那么 ipvs 模式和 iptables 模式之間有哪些差異呢?
- ipvs 為大型集群提供了更好的可擴展性和性能
- ipvs 支持比 iptables 更復雜的復制均衡算法(最小負載、最少連接、加權等等)
- ipvs 支持服務器健康檢查和連接重試等功能
ipvs 依賴 iptables
ipvs 會使用 iptables 進行包過濾、SNAT、masquared(偽裝)。具體來說,ipvs 將使用ipset
來存儲需要DROP
或masquared
的流量的源或目標地址,以確保 iptables 規則的數量是恆定的,這樣我們就不需要關心我們有多少服務了
LVS調度算法:
1. 輪叫調度 rr
這種算法是最簡單的,就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是簡單。輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器,不管后端 RS 配置和處理能力,非常均衡地分發下去。
2. 加權輪叫 wrr
這種算法比 rr 的算法多了一個權重的概念,可以給 RS 設置權重,權重越高,那么分發的請求數越多,權重的取值范圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每台服務器的性能,並給每台服務器添加要給權值,如果服務器A的權值為1,服務器B的權值為2,則調度到服務器B的請求會是服務器A的2倍。權值越高的服務器,處理的請求越多。
3. 最少鏈接 lc
這個算法會根據后端 RS 的連接數來決定把請求分發給誰,比如 RS1 連接數比 RS2 連接數少,那么請求就優先發給 RS1
4. 加權最少鏈接 wlc
這個算法比 lc 多了一個權重的概念。
5. 基於局部性的最少連接調度算法 lblc
這個算法是請求數據包的目標 IP 地址的一種調度算法,該算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的服務器,如果這台服務器依然可用,並且有能力處理該請求,調度器會盡量選擇相同的服務器,否則會繼續選擇其它可行的服務器
6. 復雜的基於局部性最少的連接算法 lblcr
記錄的不是要給目標 IP 與一台服務器之間的連接記錄,它會維護一個目標 IP 到一組服務器之間的映射關系,防止單點服務器負載過高。
7. 目標地址散列調度算法 dh
該算法是根據目標 IP 地址通過散列函數將目標 IP 與服務器建立映射關系,出現服務器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該服務器。
8. 源地址散列調度算法 sh
與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。
LVS三種模式對比:
ipvsadm參數:
添加虛擬服務器
語法:ipvsadm -A [-t|u|f] [vip_addr:port] [-s:指定算法]
-A:添加
-t:TCP協議
-u:UDP協議
-f:防火牆標記
-D:刪除虛擬服務器記錄
-E:修改虛擬服務器記錄
-C:清空所有記錄
-L:查看
添加后端RealServer
語法:ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w 指定權重]
-a:添加
-t:TCP協議
-u:UDP協議
-f:防火牆標記
-r:指定后端realserver的IP
-g:DR模式
-i:TUN模式
-m:NAT模式
-w:指定權重
-d:刪除realserver記錄
-e:修改realserver記錄
-l:查看
通用:
ipvsadm -ln:查看規則
service ipvsadm save:保存規則
負載均衡器端:
安裝LVS
[root@lb01 ~]#yum -y install ipvsadm
[root@lb01 ~]#ipvsadm
添加綁定VIP
[root@lb01 ~]#ip addr add 192.168.0.89/24 dev eth0 label eth0:1
配置LVS-DR模式
[root@lb01 ~]#ipvsadm -A -t 192.168.0.89:80 -s rr //創建一個DR,並指定調度算法采用rr。
[root@lb01 ~]#ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.93 -g //添加RS
[root@lb01 ~]#ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.94 -g //添加RS
Real-Server端
配置測試后端realserver
配置httpd省略
[root@realserver-1 ~]#curl 192.168.0.93 #測試realserver-1網站是否正常
192.168.0.93
[root@realserver-2 ~]#curl 192.168.0.94 #測試realserver-2網站是否正常
192.168.0.94
綁定VIP到lo網卡
[root@realserver-1 ~]#ip addr add 192.168.0.89/32 dev lo label lo:1 #由於DR模式需要realserver也有VIP
抑制ARP
[root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@realserver-1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@realserver-1 ~]#echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
客戶端測試
[root@test ~]#curl 192.168.0.89
192.168.0.93
[root@test ~]#curl 192.168.0.89
192.168.0.94
參考:
https://blog.csdn.net/qq_15437667/article/details/50644443
https://www.centos.bz/2017/09/lvs-intro-and-lvs-keepalived/
http://blog.maxkit.com.tw/2016/05/lvs-lvs-natlvs-tunlvs-dr.html
https://jishu.io/kubernetes/ipvs-loadbalancer-for-kubernetes/
https://blog.qikqiak.com/post/how-to-use-ipvs-in-kubernetes/
https://www.opsdev.cn/post/IPVSinKube-proxy.html