LVS-NAT、LVS-DR的工作原理并實現(xiàn)配置

一、ipvs相關(guān)和安裝:

首先查看內(nèi)核ipvs相關(guān)

[root@C712 ~]# cd /boot
[root@C712 boot]# ls
config-3.10.0-693.el7.x86_64
[root@C712 boot]# grep -i 'ipvs' -C 10 config-3.10.0-693.el7.x86_64 
.....
CONFIG_NETFILTER_XT_MATCH_IPVS=m #編譯到內(nèi)核
......
CONFIG_IP_VS_PROTO_TCP=y#對tcp支持
CONFIG_IP_VS_PROTO_UDP=y#對udp支持
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler   #支持哪些算法
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
[root@C712 boot]# yum install ipvsadm -y #安裝ipvsadm
ipvsadm:
  • 程序包:ipvsadm
  • Unit File: ipvsadm.service
  • 主程序:/usr/sbin/ipvsadm
  • 規(guī)則保存工具:/usr/sbin/ipvsadm-save
  • 規(guī)則重載工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config

ipvsadm命令:

核心功能:有兩個
1、集群服務(wù)管理:增、刪、改;
2、集群服務(wù)的RS管理:增、刪、改;
查看:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]#新增或修改一個集群服務(wù)
ipvsadm -D -t|u|f service-address#刪除一個集群服務(wù)
ipvsadm -C#清空所有的
ipvsadm -R#恢復(fù)和重載規(guī)則
ipvsadm -S [-n]#保存規(guī)則
ipvsadm -a|e -t|u|f service-address -r server-address [options]#向一個已有的集群服務(wù)添加或修改一個server
ipvsadm -d -t|u|f service-address -r server-address向一個已有的集群服務(wù)刪除一個server
ipvsadm -L|l [options]#查看集群服務(wù)
ipvsadm -Z [-t|u|f service-address]#清空計數(shù)器

二、管理集群服務(wù):增、改、刪;

1、管理集群服務(wù)增加和修改:

格式:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

2、刪除:

格式:ipvsadm -D -t|u|f service-address

3、地址格式:

service-address:
-t|u|f:
-t: TCP協(xié)議的端口,VIP:TCP_PORT
-u: UDP協(xié)議的端口,VIP:UDP_PORT
-f:firewall MARK,是一個數(shù)字;

4、調(diào)度算法格式

[-s scheduler]:指定集群的調(diào)度算法,默認(rèn)為wlc;

三、管理集群上的RS:增、改、刪;

1、管理集群上的RS增加和修改:

格式:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

2、管理集群上的RS刪除:

格式:ipvsadm -d -t|u|f service-address -r server-address

3、地址格式:

server-address:
rip[:port]:rip地址加端口

四、命令選項:

1、lvs類型:

-g: gateway, dr類型
-i: ipip, tun類型
-m: masquerade, nat類型
-w weight:權(quán)重;

2、清空定義的所有內(nèi)容:

ipvsadm -C

3、 查看:
ipvsadm -L|l [options]

--numeric, -n:numeric output of addresses and ports#數(shù)字格式顯示地址和端口,不要反解
--exact:expand numbers (display exact values)#精確顯示計數(shù)器的值
--connection, -c:output of current IPVS connections#當(dāng)前活動和非活動連接
--stats:output of statistics information#統(tǒng)計數(shù)據(jù)
--rate :output of rate information#速率

4、保存和重載:

ipvsadm -S = ipvsadm-save#保存
ipvsadm -R = ipvsadm-restore#重載

五、設(shè)計與實現(xiàn)

1、負(fù)載均衡集群設(shè)計時要注意的問題:
  • (1) 是否需要會話保持;
  • (2) 是否需要共享存儲;
  • 共享存儲:NAS, SAN, DS(分布式存儲)

2、設(shè)計要點和環(huán)境:

設(shè)計要點:

(1) RIP與DIP在同一IP網(wǎng)絡(luò), RIP的網(wǎng)關(guān)要指向DIP;
(2) 支持端口映射;
(3) Director要打開核心轉(zhuǎn)發(fā)功能;

集群環(huán)境

實驗環(huán)境 四臺centos7虛擬機(jī),分別是vs調(diào)度器、rs1后端服務(wù)器、rs2后端服務(wù)器、client客戶端


服務(wù)器ip

rs1和rs2分別關(guān)閉防火墻,安裝httpd和telnet-server,更改ip地址,網(wǎng)關(guān)指向vs調(diào)度服務(wù)器的DIP網(wǎng)卡172.16.1.254

配置測試頁面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服務(wù)器
<h1>RS1 172.16.1.11</h1> 
[root@rs1 ~]#systemctl start httpd

[root@rs2 ~]# vim /var/www/html/test.html#rs2服務(wù)器
<h1>RS2 172.16.1.12</h1> 
[root@rs2 ~]#systemctl start httpd

并把虛擬機(jī)網(wǎng)絡(luò)連接模式改成僅主機(jī)模式,來模擬內(nèi)網(wǎng)環(huán)境。


rs服務(wù)器網(wǎng)卡改成僅主機(jī)模式

vs調(diào)度服務(wù)器配置:
關(guān)閉防火墻和selinux,添加一個網(wǎng)卡


添加一個網(wǎng)卡
[root@vs ~]# nmtui#設(shè)置網(wǎng)卡命令
[root@vs ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.6  netmask 255.255.255.0  broadcast 192.168.1.255

ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.1.254  netmask 255.255.255.0  broadcast 172.16.1.255

然后將ens37網(wǎng)卡設(shè)置成僅主機(jī)模式,使其與rs1、rs2同一網(wǎng)段:


設(shè)置新添加網(wǎng)卡也是僅主機(jī)模式

3、實現(xiàn) LVS-NAT

[root@vs ~]# ipvsadm -A -t 192.168.1.6:80 -s rr #設(shè)置調(diào)度服務(wù)器規(guī)則,rr是輪詢調(diào)度
[root@vs ~]# ipvsadm -Ln#查詢
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.6:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.11 -m#把rs1服務(wù)器加入規(guī)則里
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.12 -m#把rs1服務(wù)器加入規(guī)則里
[root@vs ~]# ipvsadm -Ln#查詢
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.6:80 rr
  -> 172.16.1.11:80               Masq    1      0          0         
  -> 172.16.1.12:80               Masq    1      0          0         
[root@vs ~]# sysctl -w net.ipv4.ip_forward=1#打開核心轉(zhuǎn)發(fā)
net.ipv4.ip_forward = 1

客戶端測試:

[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>

vs服務(wù)器端:

[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s wrr#修改為加權(quán)輪詢模式
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.12 -m -w 2#修改加權(quán)輪詢
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.11 -m -w 3#修改加權(quán)輪詢
[root@vs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.6:80 rr
  -> 172.16.1.11:80               Masq    3      0          5         
  -> 172.16.1.12:80               Masq    2      0          5     

客戶端測試:

[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s sh   #把來自于同一地址的ip發(fā)往同一個rs服務(wù)器
[root@vs ~]# ipvsadm -ln --stats#統(tǒng)計數(shù)據(jù)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.1.6:80                     32      192      128    16032    15424
  -> 172.16.1.11:80                     17      102       68     8517     8194
  -> 172.16.1.12:80                     15       90       60     7515     7230
[root@vs ~]# ipvsadm -ln -c#追蹤訪問源地址
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:55  TIME_WAIT   192.168.1.10:34606 192.168.1.6:80     172.16.1.11:80

4、lvs-dr的實現(xiàn):

image.png
dr模型中,各主機(jī)上均需要配置VIP,解決地址沖突的方式有三種:

(1) 在前端網(wǎng)關(guān)做靜態(tài)綁定;
(2) 在各RS使用arptables;
(3) 在各RS修改內(nèi)核參數(shù),來限制arp響應(yīng)和通告的級別;
限制響應(yīng)級別:arp_ignore
0:默認(rèn)值,表示可使用本地任意接口上配置的任意地址進(jìn)行響應(yīng);
1: 僅在請求的目標(biāo)IP配置在本地主機(jī)的接收到請求報文接口上時,才給予響應(yīng);
限制通告級別:arp_announce
0:默認(rèn)值,把本機(jī)上的所有接口的所有信息向每個接口上的網(wǎng)絡(luò)進(jìn)行通告;
1:盡量避免向非直接連接網(wǎng)絡(luò)進(jìn)行通告;
2:必須避免向非本網(wǎng)絡(luò)通告;

  • rs1和rs2分別關(guān)閉防火墻,安裝httpd和telnet-server,更改ip地址,網(wǎng)關(guān)指向路由器。
rs1服務(wù)器配置
配置測試頁面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服務(wù)器
<h1>RS1 172.16.1.11</h1> 
[root@rs1 ~]# vim /var/www/html/phpinfo.php
<h1>RS1</h1>#rs1php測試信息頁
<?php
 phpinfo();
            ?>
[root@rs1 ~]# vim setparam.sh#編輯腳本
#!/bin/bash
#
vip=192.168.1.99
mask='255.255.255.255'

case $1 in
start)#開始設(shè)置值
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0#設(shè)置本地地址廣播

;;
stop)#停止還原成0值
ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

;;
*)#其他
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac
[root@rs1 ~]# bash -n setparam.sh #檢查腳本語法
[root@rs1 ~]# bash -x setparam.sh start#啟動腳本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0

[root@rs1 ~]# scp setparam.sh 192.168.1.12:/tmp#把腳本傳給rs2服務(wù)器
[root@rs1 ~]#systemctl start httpd

rs2服務(wù)器配置
[root@rs2 ~]# vim /var/www/html/test.html#rs2服務(wù)器
<h1>RS2 172.16.1.12</h1> 
[root@rs2 ~]# vim /var/www/html/phpinfo.php
<h1>RS2</h1>#rs2php測試信息頁
<?php
 phpinfo();
            ?>
[root@rs2 ~]# cd /tmp
[root@rs2 tmp]# ls
setparam.sh
[root@rs2 tmp]# bash -x setparam.sh start#執(zhí)行腳本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0


[root@rs2 ~]#systemctl start httpd
設(shè)置vs調(diào)度服務(wù)器:
[root@vs ~]# ifconfig ens33:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up#設(shè)置廣播地址
[root@vs ~]# ifconfig
.......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.99  netmask 255.255.255.255  broadcast 192.168.1.99
        ether 00:0c:29:8e:29:6a  txqueuelen 1000  (Ethernet)

......
[root@vs ~]# yum -y install ipvsadm#安裝lvs
[root@vs ~]# ipvsadm -A -t 192.168.1.99:80 -s rr#設(shè)定輪詢規(guī)則
[root@vs ~]# ipvsadm -ln#查詢
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.99:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.11 -g#給規(guī)則加入rs1服務(wù)器
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -g#給規(guī)則加入rs2服務(wù)器
[root@vs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.99:80 rr
  -> 192.168.1.11:80              Route   1      0          0         
  -> 192.168.1.12:80              Route   1      0          0         
客戶端測試:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.99/test.html;done
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
<h1>RS2 172.16.1.12</h1> 
<h1>RS1 172.16.1.11</h1> 
php測試1
php測試2
訪問測試頁1
訪問測試頁2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容