centos8上实现lvs集群负载均衡dr模式
1.前言
个人备忘笔记,欢迎探讨。
centos8上实现lvs集群负载均衡nat模式
centos8上实现lvs集群负载均衡dr模式
之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。
dr模式分同网段和不同网段。同网段实现简单,容易达成效果,而不同网段需要思路清晰,我更感兴趣的事实验不同网段。
不同网段时,我用了一个centos8做路由器,用于把后端服务器的http响应返回给客户机。起初tcpdump抓包实验可以在内网接口抓到响应包,但外网接口抓不到包。已经开启内核转发和关闭防火墙,甚至selinux。就是响应包过不去。为这个曾怀疑人生,但还是在努力和机缘下解决了,详见下文。
因为有上一篇铺垫,所以下面涉及网路、系统操作、web服务器,就不再赘述,重点是思路和过程。
2.实验目标:
使用调度方法rr,配合web短连接,最终在客户端访问director8080端口,要看到网页在node1/2之间切换。
数据包走向:客户机 > director > rs > 客户机。
3.客户机准备:
两台客户机如下:
物理机win11,cip=192.168.0.2。
虚拟机win11一块网卡,VMware桥接,cip=192.168.0.116。
2.同网段实验
2.1.网络结构
物理机win11的cip,虚拟机win11的cip,虚拟机director的dip和vip,虚拟机rs的rip,都桥接在一起。
还是从centos8克隆出director,rs(node1,node2)。它们只有一个桥接网卡。也就是都跟物理机一个网络。每一个centos都启用内核转发ip_forward=1。
还是要强调一下,我实验设置网路ip的工具是用NetworkManager,亦即nmcli和nmtui,用ifconfig查看。设置ip后要使用nm把连接重启一下,仅适用systemctl restart NetworkManager不行。
2.2.调度器director网络:
一块vmware桥接网卡。使用nmtui设置dip=192.168.0.3,设置完要把ens160这个连接禁用启用一下,重启连接后ifconfig可以看到ip生效。
接着把vip绑定在ens160:0别名上。
还需要加一条路由,确保请求数据包由vip响应。
2.3.后端服务器rs(node1/2)网络:
一块vmware桥接网卡,分别设置rip=192.168.0.4/5,gw=192.168.0.1(家里的路由器)。
配置好以后,director的dip192.168.0.3,vip192.168.0.8,rs的192.168.0.4,192.168.0.5,互相能ping通。
为实现dr模式三种方法,但最易用是修改内核参数。应该先修改参数再给rs绑定vip,以免局域网故障。
然后把vip绑定到lo:0别名,同时给一条路由。这条路由的意义就是让接受包途径有vip的接口,回应时把源地址“伪装”成vip。
rs上以前配置过lvs-nat测试的nginx站点,分别显示“page in node1”和“page in node2”以示区别。
设置好web服务后,稳妥起见可以分别对rip访问试试,因为现在是相同网络下。不再赘述。
2.4.调度器director策略:
dr模式不支持端口映射。
2.5.lvs-dr同网段效果:
以上设置好后,分别在物理机或虚拟机win11上尝试访问192.168.0.8:8080,刷新会看到两个页面切换。
实验成功。
3.不同网段实验:
3.1.网络结构:
下图中客户机只画了一个,不影响。
调度器需要两个网卡,一个对外一个对内。方便起见,对外接口直接和客户机桥接。对内使用vmware主机网络vmnet1。
两台后端服务器(RealServer)都是一个网络接口,使用vmnet1。
添加一个路由,两个网络接口,一个对外一个对内。
3.2.调度器director网络:
需要两个网卡,ens160对外vip=192.168.0.8,ens224对内dip=172.16.100.2。
策略修改,不用像上述“lvs-dr同网段实验”那样加路由(删掉那条即可)。
3.3.后端服务器rs网络:
由于基于上一个“lvs-dr同网段”实验,rs已经修改内核参数,lo:0接口上已经绑定vip,且做好路由。因此只是改rip:
node1是172.16.100.3,node2是172.16.100.4,网关都指向路由172.16.100.254,其它不用动。
3.4.路由router:
也是centos8克隆的,两块网卡,ens160对外192.168.0.254,ens224对内172.16.100.254,开启内核转发。它作为内网网关。我希望http的回应包先到达router的ens224内网口,再转发到ens160外网口,从而实现路由。
先说结论:原本centos8配置好网口,并开启内核转发ip_forward,它就是个天生的路由器,啥也不用动。但由于rs的回应包用vip伪装了源地址,所以router还需要设置内核参数rp_filter。就像设置rs的arp_ingore和arp_announce一样。
#sysctl -w net.ipv4.conf.all.rp_filter=0
#sysctl -w net.ipv4.conf.default.rp_filter=0(默认就是)
这里划重点,起初实验,我就卡在这里了。一定要详细记录并自省!
使用tcpdump分别在两个接口抓包。rs使用ping客户机时,可以明确看到ping的icmp包,在ens224和ens160都有抓到,亦即顺利通过路由到达ens160接口。当然,由于没处理ping回应,所以在后端服务器rs的命令行不一定看到ping通。
但是,lvs-dr的rs回应包,原本我们希望它能经此路由到达客户机,但就是通不过。使用tcpdump可以在ens224内网接口抓到,在ens160外网接口抓不到,显然没通过。
已经反反复复确认,有开启内核转发,关闭了防火墙firewalld和selinux。甚至咨询了以前的网工兄弟,他提到vmware有时候会跟实际网络不一样,有可能过滤掉“伪装”过的包,建议开启混杂模式。
于是又研究混杂模式,实际上tcpdump本身就是混杂模式,查看系统日志也看到每次抓包它就会临时开启混杂模式。所以问题不在这。
更甚至,我尝试构建了更复杂的网络,让vip和客户机不在一个网络,效果还是一样,不行。
解决:
还是要时刻熟知linux网络实现原理才行,当学习防火墙iptables时就知道,osi四层以下工作在内核空间,防火墙通过钩子函数工作在内核,跟ipvs一样,只要在内核它就时刻存在,只需要我们使用用户空间工具定制策略它就生效。而所谓数据包走向,先经过网络接口(网卡)再进入内核,然后内核决定如何转发或使用策略,属于本机该接收的包,会发给用户空间进程……总之,一旦想到原理,就立刻定位了故障点:
根据上述思路搜索原因,结果是,内核确实默认开启了“伪装”包过滤,内核参数rp_filter,就像上面后端服务器rs中修改内核参数一样。它是net.ipv4.conf.all.rp_filter和net.ipv4.conf.default.rp_filter。
改完这个参数,立竿见影,成功了。
3.5.lvs-dr不同网段效果:
每次刷新页面会在两个后端服务器上切换,不一定非是1-2-1-2这样,也可能是1-2-2-1,总之rr策略是轮巡的,负载均衡。
4.总结
本文3.4部分是最耽误我时间的,也许对于高手早就完成了。而我一开始就打算做不同网段实验一次搞定,结果总不成功,但不服输。最终还是从最简单同网段开始,需要先建立信心。
痛定思痛,基础知识还是要扎实,善于深入思考和定位问题。其实,我所谓的深入,可能对于大家来说太简单。不怕暴漏自己弱点。所以总结几点:
4.1.ping:
能否ping通,不一定能作为网络通不通的标准。ping包有去有回才“ping通”。像本文记录的,只要ping过去就可以,实际是看不到ping通的。
4.2.tcpdump:
上述我常用的:
#tcpdump -i ens224 src 192.168.0.8 and port 8080 -nn
#tcpdump -i ens160 src 192.168.0.8 and port 8080 -nn
总之看man手册就都有了,常用这些对我足够了,挺好用的。
journalctl命令可以看到tcpdump本身就是混杂模式工作的。
4.3.结束:
本文完。