LVS有三种模式,nat(地址转换),dr(直接路由),ip tunneling(IP隧道)
这三种模式各有其特点:
- nat模式可以做端口映射,相当于转发,也就会承载流量。
- dr模式目标机和调度机必须端口一致,但是负载均衡机不会有流量。
- IP隧道要求机器配置隧道设备和协议。
综上所述,DR模式相对在生产环境上用的更多。
以下是如何配置的过程,这里也会提到配置时可能存在的坑。
DS机器上的操作
lsmod |grep ip_vs #确保内核加载了ip_vs模块
yum install -y ipvsadm #安装ipvsadm
ifconfig eth0:0 192.168.xx.xx netmask 255.255.255.255 # 在LVS服务器上添加一个地址为VIP的虚拟网卡eth0:0
注意:如果这台机器上面部署的有kube-proxy,这里的配置会被反复刷掉
下线网卡命令为 ifconfig eth0:0 down
启动网卡 ifconfig eth0:0 192.168.xx.xx/32 up
子网有问题 可以调192.168.xx.xx/24
如果要在ds机器上curl本机,需要
sysctl -w net.ipv4.conf.eth0.accept_local=1
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.all.rp_filter=0
rp_filter是反向路由检查,从RS回来的报文,源IP是VIP 192.168.xx.xx,反向路由检查会用源IP192.168.xx.xx去查路由,192.168.xx.xx就在真实机器YY 上,因此路由是走lo口的,而现在从eth0口收到了,如果rp_filter=1,就会丢包。
路由实现中有个限制,即从非loopback网卡进来的任何数据包的源地址不能是本机地址,accept_local是允许这种情况。
这个是在lvs本机去curl VIP时才需要,如果是从其他机器去curl就不需要
RS机器
# 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/lo/arp_ignore
原来的值是0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
# 将ARP请求的源IP设置为eth0上的IP,也就是RIP
/proc/sys/net/ipv4/conf/lo/arp_announce
/proc/sys/net/ipv4/conf/all/arp_announce
原来的值是0
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
# 添加IP地址为VIP的虚拟网卡lo:0
ifconfig lo:0 192.168.xx.xx broadcast 192.168.xx.xx netmask 255.255.255.255
ip a可以查看
# 添加一条路由,目标IP为VIP的数据包使用lo接口发送,这样响应报文的源IP就会为VIP
route add -host 192.168.xx.xx dev lo:0
route -n 可以验证配置
修改IPVS规则
用nginx来验证,在rs机器上部署nginx(步骤略)
#在DS上添加路由
route add -host 192.168.xx.xx dev eth0
# 添加虚拟服务,指定IP、端口、算法
ipvsadm -A -t 192.168.XX.XX:16660 -s wrr
# 添加nginx1服务器,指定DR模式,指定权重为2
ipvsadm -a -t 192.168.xx.xx:16660 -r 192.168.yy.yy:16660 -g -w 2
# 添加nginx2服务器,指定DR模式,指定权重为1
ipvsadm -a -t 192.168.xx.xx:16660 -r 192.168.zz.zz:16660 -g -w 1
至此配置完成,可以在ds机器上访问本机16660端口,即可体验负载均衡效果