LVS-NAT示例
實驗環境:
使用軟件VMware WorkStation14,Director的DIP和RealServer的RS1、RS2的RIP為僅主機模式,讓其在同一個局域網內,Direcotr的VIP橋接宿主機模式。
-
一臺Director:
-
版本:CentOS7.4
-
雙網卡:
-
ens39: VIP:192.168.7.138/24,橋接模式。
-
eth37: DIP:192.168.3.1/24,此IP必須和后臺的RealSever在同一個網段內,僅主機。
-
-
-
兩臺RealServer:
-
版本:CentOS7.4
-
單網卡:
-
RS1:RIP1:192.168.3.2/24(網關必須指向DIP)
-
RS2:RIP2:192.168.3.3/24(網關必須指向DIP)
-
-
配置DirectorServer
安裝ipvsadm工具[root@DR ~]# yum install ipvsadm.x86_64 -y
配置外網網卡VIP
[root@DR ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens39
TYPE=Ethernet
NAME=ens39
UUID=f3944544-d878-4812-acc5-383100012bed
DEVICE=ens39
ONBOOT=yes
HWADDR=00:50:56:2B:EB:6D
IPADDR=192.168.7.138
PREFIX=24
GATEWAY=192.168.7.1
DNS1=192.168.7.1
配置內網網卡DIP:
[root@DR ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37? #DIP無須指定網關
TYPE=Ethernet
NAME=ens37
DEVICE=ens37
ONBOOT=yes
HWADDR=00:50:56:2E:53:C8
IPADDR=192.168.3.1
PREFIX=24
重啟網絡服務查看網絡配置是否生效
[root@DR ~]# systemctl restart network
[root@DR ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noq
ueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:2b:eb:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.7.138/24 brd 192.168.7.255 scope global ens39
valid_lft forever preferred_lft forever
inet6 fe80::3145:7364:a28b:44dd/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:2e:53:c8 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.1/24 brd 192.168.3.255 scope global ens37
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe2e:53c8/64 scope link
valid_lft forever preferred_lft forever
打開本機的路由轉發功能
[root@DR ~]# cat /proc/sys/net/ipv4/ip_forward # 查看本地路由功能是否打開(1 開啟 0 關閉)
0
[root@DR ~]# vim /etc/sysctl.conf # 開啟本地路由轉發
net.ipv4.ip_forward = 1 將0更改為1即可
[root@DR ~]# sysctl -p # 重新加載配置文件
配置RealServer1
[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.3.2
NETMASK=255.255.255.0
GATEWAY=192.168.3.1? #必須指向DIP
安裝nginx并查找替換index頁面所有的nginx為server1如下圖:
在vim末行模式輸入:%s/nginx/server1/g回車即可
此處是為了便于實驗中查看負載均衡效果,實際生產中web頁面是N臺服務器都相同的。
配置RealServer2
通過虛擬機的克隆功能快速復制RS1的副本,然后做如下修改:
- hostname改為RS2
- rm -rf /etc/udev/rules.d/70-persistent-net.rules 刪掉此文件重啟克隆機系統,在虛擬機配置網卡界面查看mac地址,在網卡配置文件中修改為此mac地址并將IP改為192.168.3.3。
- 修改index頁面為server2
ipvsadm的用法:
管理集群服務:增、改、刪;
增、改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
刪:
ipvsadm -D -t|u|f service-address
-t|u|f:
-t: TCP協議的端口,VIP:TCP_PORT
-u: TCP協議的端口,VIP:UDP_PORT
-f:firewall MARK,是一個數字;
[-s scheduler]:指定集群的調度算法,默認為wlc;
管理集群上的RS:增、改、刪;
增、改:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] #權重為0則不分配流量
刪:
ipvsadm -d -t|u|f service-address -r server-address
server-address:
rip[:port]
選項:
lvs類型:
-g: gateway, dr類型
-i: ipip, tun類型
-m: masquerade, nat類型
-w: weight,權重;
清空定義的所有內容:
ipvsadm -C
查看:
ipvsadm -L|l [options]
–numeric, -n:數字格式顯示主機地址和端口
–exact: 對輸出數據不做單位換算,顯示精確值
–connection, -c:顯示當前的ipvs連接狀況
–stats:統計數據
–rate :速率
保存和重載:
ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore
置零計數器:
ipvsadm -Z [ -t|u|f service-address ]
在DR上進行lvs-nat規則配置:
定義VIP上的80服務為集群服務:
[root@DR ~]# ipvsadm -A -t 192.168.1.171:80 -s rr
添加此集群服務的RS:
[root@DR ~]# ipvsadm -a -t 192.168.1.171:80 -r 192.168.3.2 -m
[root@DR ~]# ipvsadm -a -t 192.168.1.171:80 -r 192.168.3.3 -m
之后查看效果
用另一個客戶端去訪問
至此LVS-NAT模式下rr算法調度的實驗完成。需要注意的是如果在同一計算機上查看效果時,需要將nginx配置文件中的連接超時時間修改為0,我在實驗時遇到了win10自帶edge瀏覽器刷新不出rr輪詢效果的問題。。。。。。換用360瀏覽器可以秒切換,不知何故,暫時存疑。
LVS-DR示例
lvs-dr:
dr模型中,各主機上均需要配置VIP,解決地址沖突的方式有三種:
- 在前端網關做靜態綁定;不可用;
- 在各RS使用arptables;比較麻煩;
- 在各RS修改內核參數,來限制arp響應和通告的級別;可行;
限制響應級別:arp_ignore(響應)
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應;
1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,才給予響應;
限制通告級別:arp_announce(通告)
0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告;
1:盡量避免向非直接連接網絡進行通告;
2:必須避免向非本網絡通告;
實驗環境:
- client客戶機IP為:192.168.7.53;
- director調度服務器配置一塊網卡,在ens39上配置dip:192.168.7.141,在ens39:0別名上配置vip:192.168.7.138
- realserver1 web服務器rip為192.168.7.142,在lo本地環回接口上配置別名vip:192.168.7.138/32 broadcast 192.168.7.138,配置arp_ignore=1 ,arp_announce=2
- realserver2 web服務器rip為192.168.7.143,在lo本地環回接口上配置別名vip:192.168.7.138/32 broadcast 192.168.7.138,配置arp_ignore=1 ,arp_announce=2
在DR調度服務器上配置ens39
[root@linuxprobe ~]# ifconfig
ens39: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.141 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:50:56:2b:eb:6d txqueuelen 1000 (Ethernet)
RX packets 27872 bytes 15096757 (14.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9458 bytes 1095238 (1.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens39:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.138 netmask 255.255.255.255 broadcast 192.168.7.138
ether 00:50:56:2b:eb:6d txqueuelen 1000 (Ethernet)
在realserver1 ens33上配置RIP1,lo網卡別名上配置VIP:192.168.7.138,配置arp_ignore=1 ,arp_announce=2
echo “1”>/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “1”>/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2”>/proc/sys/net/ipv4/conf/lo/arp_announce
echo “2”>/proc/sys/net/ipv4/conf/all/arp_announce
在realserver2 ens33上同樣配置RIP2,lo網卡別名上配置VIP:192.168.7.138,配置arp_ignore=1 ,arp_announce=2
在DR調度服務器建立集群服務:
定義VIP上的80服務為集群服務:
[root@DR ~]# ipvsadm -A -t 192.168.7.138:80 -s rr
添加此集群服務的RS:
[root@DR ~]# ipvsadm -a -t 192.168.1.138:80 -r 192.168.7.142 -g
[root@DR ~]# ipvsadm -a -t 192.168.7.138:80 -r 192.168.7.143 -g
查看規則:
[root@DR ~]# 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.7.138:80 rr
-> 192.168.7.142:80 Route 1 0 0
-> 192.168.7.143:80 Route 1 0 0
查看效果:
本例遇到了用ip addr命令添加的IP莫名其妙丟失的問題,建議IP還是直接寫配置文件為妥。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/101642