centos配置LVS

LVS有三種工做模式:NAT, TUN, DR.  DR是三種工做模式中性能最高的,TUN次之。html

本文記錄LVS/TUN和LVS/DR工做模式的配置過程。linux

環境:nginx

  • 三臺CentOS 7 x64 虛擬機: CentOS Linux release 7.4.1708 (Core)
  • IP 地址分別爲192.168.1.11/24, 192.168.1.12/24, 192.168.1.13/24
  • 虛擬IP爲192.168.1.99, 網絡結構爲:

1. LVS/TUN – 隧道模式:

Director(192.168.1.11)上的配置:web

爲tunl0設備配置VIP:算法

# ifconfig tunl0 192.168.1.99 broadcast 192.168.1.99 netmask 255.255.255.255 up

安裝ipvsadm工具:docker

# yum install ipvsadm

 

用ipvsadm配置LVS轉發器:centos

  • 清除配置表
  • 添加一個訪問地址爲192.168.1.99:80的TCP服務,並設置調度算法爲輪叫(rr)
  • 爲服務添加兩個Real Server 192.168.1.12 和 192.168.1.13, -i參數標識工做模式爲TUN模式
  • 最後清除iptables,從新生成
# ipvsadm -C
# ipvsadm -A -t 192.168.1.99:80 -s rr
# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -i
# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.13 -i
# iptables -F

配置完成後使用ipvsadm -Ln查看:瀏覽器

# 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.12:80              Route   1      0          0         
  -> 192.168.1.13:80              Route   1      0          0

 

 

Real Server(192.168.1.12,192.168.1.13)上的配置:緩存

  • 配置VIP
  • 配置Real Server不響應VIP的ARP請求
  • 關閉數據包源地址檢驗
  • 最後清除iptables,從新生成
# ifconfig tunl0 192.168.1.99 broadcast 192.168.1.99 netmask 255.255.255.255 up
# echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
# echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
# echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
# echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
# iptables -F
  • 在Real Server上啓動一個簡單的web服務。兩種方式:

1. 在192.168.1.12和192.168.1.13上直接經過rpm包安裝nginx, 在192.168.1.12和192.168.1.13上配置兩個web server顯示兩個可識別的web頁面:網絡

# rpm -Uvh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.14.0-1.el7_4.ngx.x86_64.rpm

2. 經過docker使用默認NAT網絡啓動一個nginx實例,在192.168.1.12和192.168.1.13上配置兩個nginx實例顯示兩個可識別的web頁面。經過docker啓動web服務時要在Real Server上開啓ip_forward, 由於docker run默認使用的NAT網絡依賴ip_forward:

# docker run --name nginx -d -p 80:80 -v /etc/nginx/:/etc/nginx/ -v /var/www/html/:/usr/share/nginx/html/ -v /var/log/nginx/:/var/log/nginx/ nginx:1.13.12
# echo "1" > /proc/sys/net/ipv4/ip_forward

最後執行iptables -F確保全部通訊不被防火牆阻擋。

LVS/TUN模式配置完成,經過在另外一個linux 虛擬機中經過curl訪問192.168.1.99, 能夠看到http請求會以輪詢的方式被分別轉發到的192.168.1.12和192.168.1.13:

在瀏覽器中訪問時因爲瀏覽器緩存可能沒那麼明顯。

 

2. LVS/DR 模式:

Director(192.168.1.11)上的配置:

# ifconfig enp0s3:0 192.168.1.99 netmask 255.255.255.255 up
# ipvsadm -C
# ipvsadm -A -t 192.168.1.99:80 -s rr
# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -g
# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.13 -g
# iptables -F

DR模式不使用隧道設備tunl0, 而是把虛擬IP配置本地網卡別名enp0s3:0上,添加Real Server時指定模式爲-g。也有人說把虛擬IP配置在lookback別名上,實測配置在loopback好像對real server的輪詢切換並不那麼及時。

Real Server(192.168.1.12,192.168.1.13)上的配置:

# ifconfig enp0s3:0 192.168.1.99 netmask 255.255.255.255 up
# echo "1" > /proc/sys/net/ipv4/conf/enp0s3/arp_ignore
# echo "2" > /proc/sys/net/ipv4/conf/enp0s3/arp_announce
# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
# iptables -F

如需網絡內核參數永久生效請修改/etc/sysctl.conf (最好這樣作):

# cat <<EOF >> /etc/sysctl.conf
net.ipv4.conf.enp0s3.arp_ignore = 1
net.ipv4.conf.enp0s3.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
# sysctl -p

Real Server中一樣要配置虛擬IP,並設置不響應對192.168.1.99的arp查詢,Web Server的配置與TUN模式相同。

配置完成。

 

Tips:

若是在Director上也有web服務,還能夠把Director(192.168.1.11)也做爲Real Server使用。


參考信息:

關於arp_ignore, arp_announce, rp_filter參數的做用,請參見:

上述配置在firewalld爲運行狀態而且SELinux爲Enforcing狀態時測試經過。

全部的網絡參數配置均爲臨時當即生效,若要長久生效,請修改/etc/sysctl.conf文件,並執行sysctl -p

# vi /etc/sysctl.conf
# sysctl -p

ipvsadm配置的內容在系統重啓後也會丟失,可能經過ipvsadm -Sn保存到文件,而後可經過ipvsadm –restore加載。

注意ipvsadm的-S(–save)一塊兒要跟上n參數,不然會保存錯誤的IP地址。

[root@centos01 ~]# 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.12:80 Route 1 0 7 
 -> 192.168.1.13:80 Route 1 0 4 
[root@centos01 ~]# ipvsadm -Sn > ipvsadm.conf
[root@centos01 ~]# cat ipvsadm.conf
-A -t 192.168.1.99:80 -s rr
-a -t 192.168.1.99:80 -r 192.168.1.12:80 -g -w 1
-a -t 192.168.1.99:80 -r 192.168.1.13:80 -g -w 1
[root@centos01 ~]# ipvsadm -C
[root@centos01 ~]# cat ipvsadm.conf | ipvsadm --restore
[root@centos01 ~]# 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.12:80 Route 1 0 4 
 -> 192.168.1.13:80 Route 1 0 4

若是遇到轉發故障可經過tcpdump進行診斷。如:監聽接口enp0s3,抓取host爲192.168.1.99而且目的端口爲80,或host爲192.168.1.12而且源端口爲80的數據包:

# tcpdump -i enp0s3 '((dst port 80) and (host 192.168.1.99)) or ((src port 80) and (host 192.168.1.12))'

關於LVS的調度算法請參見:LVS集羣的負載調度

相關文章
相關標籤/搜索