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后要使用nmtui把连接重启一下,仅使用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通。

由于调度器director和后端服务器rs上都有vip,为实现dr模式有三种方法,最易用的是修改rs的内核参数。应该先修改参数再给rs绑定vip,以免局域网故障。

然后把vip绑定到lo:0别名,同时给一条路由。这条路由的意义就是让接收包途径有vip的接口,如此就可以回应时把源地址"伪装"成vip。

rs上以前配置过lvs-nat测试的nginx站点,分别显示"page in node1"和"page in node2"以示区别。(详见上一篇博客)

设置好web服务后,稳妥起见可以分别对rip访问试试,因为现在是相同网络下。不再赘述。

2.4.调度器director策略:

由于回应包不经过dr原路返回,所以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回应包,原本我们希望它能像ping一样经此路由到达客户机,但就是通不过。使用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.结束:

本文完。

相关推荐
the_nov7 分钟前
19.TCP相关实验
linux·服务器·网络·c++·tcp/ip
Y淑滢潇潇1 小时前
RHCSA Linux 系统创建文件
linux·运维·服务器
XYN611 小时前
【嵌入式学习3】基于python的tcp客户端、服务器
服务器·开发语言·网络·笔记·python·学习·tcp/ip
the_nov1 小时前
20.IP协议
linux·服务器·网络·c++·tcp/ip
源代码•宸2 小时前
Visual Studio Code SSH 连接超时对策( keep SSH alive)
运维·服务器·ide·经验分享·vscode·ssh
zyx没烦恼3 小时前
Linux 下 日志系统搭建全攻略
linux·服务器·开发语言·c++
半新半旧4 小时前
Nginx 负载均衡案例配置
运维·nginx·负载均衡
码上飞扬4 小时前
深入探索 Linux Top 命令:15 个实用示例
linux·运维·服务器
灰色人生qwer4 小时前
内网服务器centos7安装jdk17
java·运维·服务器