LVS的几种调度模式(NAT,FullNAT,DR,TUN)

LVS-NAT
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑选出的RS的RIP和port实现转发
1)RIP和DIP必须在同一网络下,且应该使用私网地址,RS的网关要指向DIP;
2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
3)支持端口映射,可修改请求报文的目标端口;
4)VS必须是Linux系统,RS可以是任意系统;
特点:RealServer的网关必须指向DIP,致使Director与RS需在同一机房
 
 
LVS-FullNAT
与LVS-NAT相比,解决了Director必须与RS在同一网络下的问题。
特点:因FullNAT不仅会改目标地址,源地址也会更改,RealServer的网关可以不再指向DIP,致使Director与RS不需要在同一机房
    
 
LVS-DR(Direct Route,直接路由)
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/Port,以及目标IP/Port均保持不变;
 
Director和RS都必须配置VIP
 
1)确保前端路由器将目标IP为VIP的请求报文 发往Director,方法如下:
    a)在前端网关做静态绑定;×
    b)在RS上使用arptables;×
    c)在RS上修改内核参数以限制arp通告及应答级别;√
            arp_announce
            arp_ignore
2)RS上的IP可以使用私网IP,也可以使用公网地址;RIP与DIP在同一IP网络;RS的网关不能指向DIP,以确保响应报文不会经由Director;
3)RS跟Director要在同一物理网络;
4)请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
5)不支持端口映射;
 
 
LVS-TUN
转发方式:步修改请求报文的首部(源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得支持隧道功能;
 

 
利用docker测试
 
下载一个镜像
# docker image pull busybox
启动
# docker run --name rs1 -it --network bridge -v /vols/rs1:/data/web/html busybox
开启httpd服务
/ # httpd -h /data/web/html/
查看服务
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 :::80                   :::*                    LISTEN
创建首页
# cd /vols/rs1
# vim index.html
<h1>RS1</h1>
验证
# curl 172.17.0.2
<h1>RS1</h1>
 
同样地创建容器rs2
 
配置宿主机的docker.service文件,让docker启动时不要将FORWARD链默认置成Drop,否则转发功能失效
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.3.95
ExecStartPort=/usr/sbin/iptables -P FORWARD ACCEPT
ExecReload=/bin/kill -s HUP $MAINPI
# systemctl daemon-reload
# systemctl restart docker
# iptables -vnL
Chain INPUT (policy ACCEPT 45 packets, 2628 bytes)
pkts bytes target     prot opt in     out     source               destination         
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
临时修改
# iptables -P FORWARD ACCEPT
# iptables -vnL
 
查看当前有没有ipvs格则
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
 
添加一个规则,tcp,将ip172.18.0.66:80定义为集群服务 调度算法wrr
# ipvsadm -A -t 172.18.0.66:80 -s wrr
查看
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.0.66:80 wrr
针对一个集群服务,添加RS,集群类型为NAT,权重是1
# ipvsadm -a -t 172.18.0.66:80 -r 172.17.0.2:80 -m -w 1
# ipvsadm -a -t 172.18.0.66:80 -r 172.17.0.3:80 -m -w 1
查看
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.0.66:80 wrr
  -> 172.17.0.2:80                Masq    1      0          0         
  -> 172.17.0.3:80                Masq    1      0          0
 
改权重
# ipvsadm -e -t 172.18.0.66:80 -r 172.17.0.2 -m -w 2
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.0.66:80 wrr
  -> 172.17.0.2:80                Masq    2      0          0         
  -> 172.17.0.3:80                Masq    1      0          0
 
 
 
DR的具体实现
 
1.给Director设定vip(172.18.0.70)
# ifconfig ens32:0 172.18.0.70 netmask 255.255.255.255 brodcast 172.18.0.70
 
2.给Real Server的lo网卡接口上配置vip(172.18.0.70)
为什么要设置在lo上?有助于解决忽略apr应答和通告
忽略应答:RS上有两个IP,一个是RIP,一个是VIP。客户端请求的是VIP,相应地,当客户端请求报文来到服务端网络时,会有ARP请求询问VIP的mac地址,将RS的VIP设置在lo上后,当配置RIP的物理网卡接受到该请求时会发现本机有配置VIP,但VIP没法直接应答,因为VIP不在接受请求的物理网卡上,再有内核设置了应答级别,此时设置了VIP的lo接口也无法应答。
忽略通告:/proc/sys/net/ipv4/conf/lo/arp_annouce设置为2,代表通告只发送给网卡所在网络,不会发给网卡所在宿主机所连接的所有网络。这样,将VIP配置在lo上,VIP的请求通告也只会发给lo所在的RS内部网络,该通告并不会通告RIP所在的网卡发往网关,从而彻底避免了VIP网络地址冲突的问题。
 具体配置写成如下脚本:

 

 

 
以上脚本在各RS上依次执行即可。启用DR模式的RS传参start即可
接下来
 
测试:
找一个内网客户端
# ping 172.18.0.70
64 bytes from 172.18.0.70 ... ...
# arp 172.18.0.70
 地址             类型         硬件地址
172.18.0.70  ether        00:0c:29:37:01:7e
arp请求VIP,结果应答的只有Director的硬件地址00:0c:29:37:01:7e
 
3.在Director上定义集群
# ipvsadm -A -t 172.18.0.70:80 -s wrr
给集群添加Real server
# ipvasdm -a -t 172.18.0.70:80 -r 172.18.0.67 -g -w 2
# ipvasdm -a -t 172.18.0.70:80 -r 172.18.0.68 -g -w 3
查看
# ipvsadm -Ln
posted @ 2020-09-22 20:04  Edward_han  阅读(601)  评论(0编辑  收藏  举报