1、实验前准备:
快照虚拟机硬盘文件vm1,vm2,vm3
添加虚拟机,导入存在镜像vm1、2、3分别创建虚拟机vm1、2、3
不采用NAT模式,采用网桥模式:
同样方式创建vm2、3。
vm1、2、3网卡vnet0、1、2都桥接在br0上
虚拟机vm2、3上更改hostname和ip
vm2上:
vm3上相应的改为server3和172.25.254.3即可。
2、LVS概念:
LVS集成在Linux内核中,有三种模式NAT模式、TUN隧道模式、DR模式。
DR模式要求所有节点都在一个VLAN(即同一个网段,172.25.254.x表示同一网段),适合当前实验;NAT在不同的网段;隧道TUN支持广域网。但是生产环境用的是第四种。
server1作为负载均衡节点,server2、3作real server。通过server1负载均衡后端的两个real server。
3、DR模式负载均衡实现:
在server1上安装客户端,用户层面的工具ipvsadm;
在server1上添加VIP:ip addr add 172.25.254.100/24 dev eth0,当访问VIP时候实现负载均衡,
ipvsadm -ln查看调度策略,此策略和防火墙类似,策略直接写在内存
-A 添加tcp服务 -t 向虚拟服务172.25.254.100:80添加 当访问172.25.254.100:80 的时候调度到real server -s调度算法 (默认支持10种调度算法) rr轮调方法
-a 添加real server -t 向虚拟服务172.25.254.100:80 添加 -r表示real server 172.25.254.2:80和172.25.254.2:80 -g表示直连,
查看调度策略,当访问TCP 172.25.254.100:80时采用rr均衡调度到172.25.254.2:80或172.25.254.3:80的标准80服务上(生产环境中增大哈希表size为2^20或者2^22,size=4096太小,高并发环境中会丢包)
ipvsadm在防火墙后,数据包经过网卡进来,ipvsadm进行包过滤,发现符合TCP虚拟服务(172.25.254.100:80)的数据包,转发到LVS调度列表,LVS使用内核功能。
real server server2、3上使用apache服务,当访问server2、3时显示自定义的网页发布内容:
安装httpd:
设置开机自启并打开服务,并且在server2网页发布目录/var/www/html/index.html写入server2;curl localhost访问得到server2文字。server3安装httpd,设置开机自启并打开服务,同上,但写入server3在发布目录中。
实验预期:当访问vip172.25.254.100时,调度到254.2或254.3上,其上面利用httpd,显示网页发布内容(访问server2显示server2文字,访问server3显示server3文字)。
问题1:在宿主机38上实验调度是否正常,
访问不正常,但是server1上查看有调度策略,InActConn 为3和4表示调度器正常,但是调度到2、3上出现问题,则问题在2、3上。调度机制在第二层数据链路层通过调度算法直接把数据包转发到real server 2、3上,所以必须要在一个VLAN里面,不能经过路由。
上面是因为2、3上没有VIP,TCP三次握手访问vip172.25.254.100,当数据包到达254.2上时,从二层向上解没发现254.100,直接被Linux内核丢弃。
所以在2、3上添加vip,172.25.254.100/32仅限本机使用,不是标准的172.25.254.100/24。
查看
server3上相同操作,
宿主机38上访问正常调度:
问题2:宿主机38上arp -an |grep 100过滤172.25.254.100
过滤到e9:f8为缓存的mac地址(server1的mac地址);arp -d 172.25.254.100删除172.25.254.100缓存;
宿主机38上再次访问172.25.254.100只调度到server2上,不能成功调度,首先server1上查看调度器,发现调度策略InActConn不增加还是3和4,所以判断访问没有经过调度器
然后宿主机38上arp -an |grep 100过滤172.25.254.100过滤到13:1d(server2的mac地址)为缓存的mac地址
上述问题,是因为server1、2、3都含有相同vip172.25.254.100,并且和宿主机38在同一个VLAN下,在宿主机38上curl 172.25.254.100时,可能发生冲突,访问到server1、2、3任意一个vip上。(1)访问到server1上的vip时正常调度,server2、3论调(2)访问到server2上的vip时,只显示server2,不经过调度器server1,调度策略不增加(3)访问到server3上的vip时,只显示server3,不经过调度器server1。
arp -d 172.25.254.100删除缓存后,宿主机38上再次curl 172.25.254.100,会随机缓存server1、2、3上的mac地址,且后面不删除,缓存不变,访问结果不变。mac信息以广播的形式进行选择,谁先响应,先缓存谁。
在real server上添加vip是为了正常完成三次握手,数据包到real server上需要vip,即目标地址都得是254.100。
解决:多种方法,修改linux内核;使用arptables工具
本实验使用arptables工具解决:
在real server2、3上安装arptables
arptables 区别于iptables只是针对arp协议,添加两条策率防止访问到real server2、3的vip上:
直接访问server2、3的vip是被禁止的:此策略加到server2、3的INPUT链(进入server2、3时);OUTPUT链上加策率,不能对外广播
到server2上的目标地址是254.100时直接DROP掉(访问server2的vip254.100时直接丢弃)
源地址是254.100时进行源地址转换,转换ip为172.25.254.2(正常调度到server2,server2使用vip254.100完成三次握手后,转换为254.2)
server3上相同操作:
查看arp策率:
arp策率都是在缓存里,重启的话或者arptables -F删除后就没了,保存起来(保存后重启服务会自动读取策略)
下面依次是 保存、cat查看、删除、删除后显示策略为空、重启服务自动读取策略
要想arp策略开机生效,把arptables服务设置为开机自启,服务启动后自动读取策略
上述策略执行后,宿主机38上删除172.25.254.100缓存,再次访问多次总会访问到server1成功调度,调度策略正常增加
并且ipvsadm -ln查看有调度策略,InActConn增加,调度器正常。