結構圖: 環境準備 lvs [root@lvs ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=none NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=10.0.0. ...
結構圖:
環境準備
lvs
[root@lvs ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.8
PREFIX=24
[root@lvs ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.10.100
PREFIX=24
client:
root@ubuntu1604:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
#auto eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet static
address 192.168.10.6
netmask 255.255.255.0
RS1:
#安裝並啟動httpd服務
[root@RS1 ~]# echo 10.0.0.7 rs1 > /var/www/html/index.html
[root@RS1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.8 #rs的網關地址要指向DIP
Rs2:
#安裝並啟動apache服務
[root@RS2 ~]# echo 10.0.0.17 rs2 > /var/www/html/index.html
[root@RS2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.8
負載均衡集群配置:
#開啟Ip_forward功能
[root@lvs ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
#
#
net.ipv4.ip_forward = 1 #開啟ip_forward功能
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]# ipvsadm -A -t 192.168.10.100:80 -s wrr #創建要給集群 使用wrr(加權輪詢)這種調度演算法
[root@lvs ~]# ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.7:80 -m #將10.0.0.7這個rs加入集群中 -m表示使用nat這種工作模式
[root@lvs ~]# ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.17:80 -m
[root@lvs ~]# 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.10.100:80 wrr
-> 10.0.0.7:80 Masq 1 0 0
-> 10.0.0.17:80 Masq 1 0 0
客戶端測試:
採用輪詢的調度演算法,每個rs輪詢一遍。
root@ubuntu1604:~# curl 192.168.10.100
10.0.0.17 rs2
root@ubuntu1604:~# curl 192.168.10.100
10.0.0.7 rs1
root@ubuntu1604:~# curl 192.168.10.100
10.0.0.17 rs2
root@ubuntu1604:~#
root@ubuntu1604:~# curl 192.168.10.100
10.0.0.7 rs1
...........
LVS工作的時候是工作在內核的內核空間
不開啟ip_forward的時候,能將請求發送給RS的原因(響應請求回來的時候要通過forward):
iptables的五鏈,報文通過網卡進入lvs後,首先通過prerouting進行路由選擇,因為報文就是發給本機的,所以就將報文發給了input,正常情況下input會把報文交給用戶空間的應用程式(例如用戶訪問xxx的web服務)。而lvs自身沒有這個服務,所以就截住請求轉發到postrouting裡面去。
截住請求:在input鏈的前面加一個lvs規則,當用戶訪問vip的時候,就把目標地址改為rip。就實現了不往input上發,而是往postrouting上轉發。
實現流程:
1.發送請求:
客戶端請求:192.168.10.6(源)--->192.168.10.100(目標)
lvs伺服器:192.168.10.6(源不變)--->10.0.0.7/17(目標) --- lvs伺服器轉發請求的是偶目標地址發生了改變。
2.rs響應請求:
RS的那個埠收到請求,就使用那個埠來回應這個請求。因為lvs是內核的一個功能,內核不存在埠這些說法,所以不用在lvs上開啟對Client請求埠的監聽,
RS:10.0.0.7(源地址)---->10.0.0.8(目標IP)----響應報文發到達lvs伺服器
192.168.10.100(源地址)--->192.168.10.6(client的地址)
註意;
埠也會發生改變,比如CID請求的是80埠,但是RS提供web服務的埠是8080,這個時候就會自動把埠變為8080