lvs的使用

一、簡述lvs四種集羣特點及使用場景

  • lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
  • lvs-dr:操縱封裝新的MAC地址
  • lvs-tun:在原請求IP報文之外新加一個IP首部
  • lvs-fullnat:修改請求報文的源和目標IP
lvs-nat模式:

本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改爲某挑出的RS的RIP和
PORT實現轉發。
(1)RIP和DIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIP
(2)請求報文和響應報文都必須經由Director轉發,Director易於成爲系統瓶頸
(3)支持端口映射,可修改請求報文的目標PORT
(4)VS必須是Linux系統,RS可以是任意OS系統




LVS-DR模式:

​ Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過爲請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變。

​ (1)Director和各RS都配置有VIP

​ (2)確保前端路由器將目標IP爲VIP的請求報文發往Director
​ 在前端網關做靜態綁定VIP和Director的MAC地址
​ 在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

​ (3)RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向
DIP,以確保響應報文不會經由Director

​ (4)RS和Director要在同一個物理網絡

​ (5)請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client

​ (6)不支持端口映射(端口不能修敗)

​ (7)RS可使用大多數OS系統

LVS的TUN模式 轉發方式:

​ 不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP)

​ (1)DIP, VIP, RIP可以是公網地址

​ (2)RS的網關一般不能指向DIP

​ (3)請求報文要經由Director,但響應不經由Director

​ (4)不支持端口映射

​ (5)RS的OS須支持隧道功能

LVS的FULLNAT模式:

​ 通過同時修改請求報文的源IP地址和目標IP地址進行轉發

​ CIP --> DIP

​ VIP --> RIP

​ 注意:此類型kernel默認不支持,

​ (1)VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向
DIP

​ (2)RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client

​ (3)請求和響應報文都經由Director

​ (4)相對NATi模式,可以更好的實現LVS-RealServer間跨VLAN通訊

​ (5)支持端口映射

二、描述LVS-DR工作原理,並配置實現。

1、LVS-DR工作原理。

​ LVS-DR:Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過爲請求報文重新封裝一個MAC首部
進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變

2、LVS實驗需要5臺centos8主機。

​ 分別需要客戶機1臺、路由主機1臺、LVS主機1臺、web服務器2臺

3、配置各臺主機網絡,配置如下:

(1)client主機,eth0使用僅主機模式,網關指向路由主機eth1網卡

NAME="eth0"
DEVICE="eth0"
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.0.8
GATEWAY=192.168.0.68
PREFIX=24
TYPE=Ethernet

(2)route主機,eth0使用nat模式,eth1使用僅主機模式,啓用IP_FORWARD。

NAME="eth0"
DEVICE="eth0"
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.68
PREFIX=24
TYPE=Ethernet

NAME="eth1"
DEVICE="eth1"
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.0.68
PREFIX=24
TYPE=Ethernet

[root@route ~]#echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf 

(3)lvs主機,eth0使用nat模式,網關指向路由主機eth0網卡。

NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.78
PREFIX=24
GATEWAY=10.0.0.68
TYPE=Ethernet

(4)rs1主機,eth0使用nat模式,網關指向路由主機eth0網卡。

NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.88
PREFIX=24
GATEWAY10.0.0.68
TYPE=Ethernet

(5)rs2主機,eth0使用nat模式,網關指向路由主機eth0網卡。

NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.98
PREFIX=24
GATEWAY10.0.0.68
TYPE=Ethernet

4、rs1和rs2配置內核參數和vip,要先修改內核參數再添加地址,兩臺都要執行。

[root@rs1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@rs1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]#ifconfig lo:1 10.0.0.100 netmask 255.255.255.255

#永久保存內核參數需要把下面4行添加到/etc/sysctl.conf裏
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@rs1 ~]#sysctl -p
#lo網卡地址保存需要設置ifconfig命令開機時執行
[root@rs1 ~]#echo "ifconfig lo:1 10.0.0.100 netmask 255.255.255.255" >> /etc/rc.d/rc.local 
[root@rs1 ~]#chmod +x /etc/rc.d/rc.local

5、rs1和rs2安裝httpd服務,設爲開機啓動。

[root@rs1 ~]#yum install -y httpd ; systemctl enable --now httpd

6、rs1和rs2添加不同的index.html,以便檢測效果。

[root@rs1 ~]#echo rs1 /var/www/html/index.html
[root@rs2 ~]#echo rs2 /var/www/html/index.html

7、lvs主機添加vip,安裝ipvsadm軟件包。

[root@lvs ~]#ifconfig eth0:1 10.0.0.100 netmask 255.255.255.255
[root@lvs ~]#yum install -y ipvsadm

8、lvs主機設置DR規則。

[root@lvs ~]#ipvsadm -A -t 10.0.0.100:80 -s rr 
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.88:80 -g
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.98:80 -g
[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  10.0.0.100:80 rr
  -> 10.0.0.88:80                 Route   1      0          0         
  -> 10.0.0.98:80                 Route   1      0          0 

9、測試客戶端訪問,已實現負載均衡。

[root@centos08 ~]#curl  10.0.0.100
rs1
[root@centos08 ~]#curl  10.0.0.100
rs2
[root@centos08 ~]#curl  10.0.0.100
rs1
[root@centos08 ~]#curl  10.0.0.100
rs2

10、持久化保存lvs的規則,先手動保存一次,ipvsadm服務設爲開機啓動即可自動保存和加載lvs規則。

[root@lvs ~]#ipvsadm -S >/etc/sysconfig/ipvsadm
[root@lvs ~]#systemctl enable --now ipvsadm.service 
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.

三、實現LVS+Keepalived高可用。

1、本實驗在上例的基礎上完成,client、rs1、rs2不變,原lvs服務器安裝Keepalived軟件包作爲主服務器,增加備份LVS+Keepalived服務器一臺和sorry server服務器一臺。

2、新增服務器網卡配置。

#備LVS+Keepalived服務器網卡配置
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.58
PREFIX=24
GATEWAY=10.0.0.68
TYPE=Ethernet

#sorry server主機網卡配置
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.77
PREFIX=24
GATEWAY10.0.0.68
TYPE=Ethernet

3、sorry server服務器參照rs1服務器的方法配置內核參數,在lo網卡上添加vip,安裝httpd,設置index頁面。

[root@sorry ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@sorry ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@sorry ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@sorry ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@sorry ~]#ifconfig lo:1 10.0.0.100 netmask 255.255.255.255
[root@sorry ~]#yum install -y httpd
[root@sorry ~]#systemctl enable --now httpd
[root@sorry ~]#echo sorry >/var/www/html/index.html

4、主備兩臺LVS+Keepalived服務器安裝ipvsadm和Keepalived,啓動服務,要保證版本一致。

[root@lvs1 ~]#yum  install -y keepalived
[root@lvs1 ~]#systemctl enable --now keepalived.service 
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.

[root@lvs2 ~]#yum  install keepalived
[root@lvs2 ~]#systemctl enable --now keepalived.service 
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.

[root@lvs2 ~]#yum install -y ipvsadm

5、修改主服務器Keepalived配置文件,重啓服務。

[root@lvs1 ~]#vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER                 #MASTER代表主服務器
    interface eth0               #設置vip所在的網卡,不要使用lo網卡
    virtual_router_id 51         #這個數值要和備服務器一致
    priority 100                 #這個數值要比備服務器大
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {          #vip
        10.0.0.100
    }   
}
virtual_server 10.0.0.100 80 {   #vip
    delay_loop 6
    lb_algo rr
    lb_kind DR                   #DR模式
    protocol TCP 
    sorry_server 10.0.0.77 80    #sorry server  dip
    real_server 10.0.0.88 80 {   #rs1  dip
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
    }   
}
    real_server 10.0.0.98 80 {    #rs2  dip
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
    }   
}   
}

[root@lvs1 ~]#systemctl restart keepalived.service 

6、複製主LVS+Keepalived服務器配置文件到備服務器,修改部分內容,重啓服務。

#修改下里兩行,其他不變
[root@lvs1 ~]#vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BAKCKUP           #MASTER改爲BACKUP
    priority 50             #這個數值比主服務器的小即可

[root@lvs2 ~]#systemctl restart keepalived.service 

7、主服務器故障後,vip地址可以自動飄動到備服務器,主服務器恢復後vip地址自動回到主服務器,期間不影響用戶訪問。

[root@lvs1 ~]#hostname -I
10.0.0.78 10.0.0.100 
[root@lvs1 ~]#systemctl stop keepalived.service 
#停止服務後lvs1的vip地址消失
[root@lvs1 ~]#hostname -I
10.0.0.78 

#lvs2出現vip地址
[root@lvs2 ~]#hostname -I
10.0.0.58 
[root@lvs2 ~]#hostname -I
10.0.0.58 10.0.0.100 

8、後端rs1和rs2其中一臺故障後,會被Keepalived檢測到,自動不轉發請求到該服務器,後端兩臺全部故障後可顯示sorry derver頁面提示用戶,後端服務器恢復後即可正常訪問。

[root@centos08 ~]#curl 10.0.0.100
rs1
[root@centos08 ~]#curl 10.0.0.100
rs2
[root@centos08 ~]#curl 10.0.0.100
rs2
[root@centos08 ~]#curl 10.0.0.100
rs2
[root@centos08 ~]#curl 10.0.0.100
sorry
[root@centos08 ~]#curl 10.0.0.100
rs1
[root@centos08 ~]#curl 10.0.0.100
rs2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章