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集羣的負載調度