LVS操作实践

一、实验环境说明

我们知道 LVS 工作模式有DR、NAT、Tunnel 模式,这篇文章中会针对每个模式进行实践操作,通过实验来更深入理解工作原理。我们需要3台服务器来进行模拟。

  • 操作系统
    1
    CentOS release 6.7 (Final)
  • 内核版本
    1
    2.6.32-573.el6.x86_64
  • 相关服务器
    1
    2
    1 台 LVS 服务器
    2 台后端真实服务器(nginx)

二、LVS相关组件

  • IPVS。LV 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。那么用户是如何配置 VIP 等相关信息并传递到 IPVS 的呢,就需要用到 ipvsadm 工具。
  • ipvsadm 工具。ipvsadm 是 LVS 用户态的配套工具,可以实现 LVS 和 RS 的增删改查功能。它是基于 netlink 或 raw socket 方式与内核 LVS 进行通信,如果 LVS 类比 netfilter ,那么 ipvsadm 就是类似 iptables 工具的地位。
  • keepalived。ipvsadm 是一个命令行工具,如果 LVS 需要配置的业务非常复杂,ipvsadm 就很不方便了。Keepalived 最早就是为了 LVS 而生的,非官方开发的,它提供了配置文件的形式配置管理(持久化),服务的增删改查,操作非常方便。另外,Keepalived 支持配置虚拟的 VIP,能够实现 LVS 的高可用,实际生产环境中一般离不开它。

虽然 Keepalived 使用起来非常方便,不过在实验环境中为了简化步骤,也能够更清楚的理解操作步骤和原理,所有的操作都是用 ipvsadm 命令来进行的。后边也会简单介绍使用 keepalived 进行 LVS 服务的操作管理。

三、DR 模式操作实践

实验环境

  • LVS:DIP=192.168.111.10 VIP=192.168.111.100
  • nginx1=192.168.111.11
  • nginx2=192.168.111.12

LVS服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
iptables -F
service iptables save
ifconfig eth0:1 192.168.111.100 netmask 255.255.255.255 broadcast 192.168.111.100 up
yum install ipvsadm -y
cat > lvs_dr.sh <<EOF
/sbin/ipvsadm -C # 清除原有规则
/sbin/ipvsadm -A -t 192.168.111.100:80 -s rr # 添加vip:80的tcp服务
/sbin/ipvsadm -a -t 192.168.111.100:80 -r 192.168.111.11:80 -g # 添加nginx1服务器
/sbin/ipvsadm -a -t 192.168.111.100:80 -r 192.168.111.12:80 -g # 添加nginx2服务器
EOF
/bin/bash lvs_dr.sh
ipvsadm -ln -t 192.168.111.100:80

后端服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
iptables -F
service iptables save
yum install wget -y
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
chkconfig nginx on
/etc/init.d/nginx start
ifconfig lo:0 192.168.111.100 broadcast 192.168.111.100 netmask 255.255.255.255 up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0

执行测试

1
curl http://192.168.111.100

DR 配置信息的含义

1
2
3
4
5
6
7
8
9
10
11
12
Linux 内核参数arp_ignore和arp_announce作用说明
arp_ignore - INTEGER
0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答;
1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应;
2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求;
3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
4-7:保留
8:不应答所有本地IP
arp_announce - INTEGER
0:默认值,允许使用本机上所有接口的IP作ARP通告。
1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告。
2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告。
  • 为什么需要在 lo 接口上配置 vip ?

    1
    我们知道如果服务器收到的数据包IP地址不是本机地址(没有开启转发模式),就会丢弃。后端服务器收到 DR 模式的数据包,此时目标 IP 是 VIP,服务器会认为此数据包不是发送给本机的,会丢弃。而我们再 lo 接口上配置 VIP 后,服务器就能够正常接收到此数据包,发送给响应的应用程序。因为,在 lo 上配置 vip 能够完成接收数据包并将结果返回给客户端。
  • 为什么需要配置 arp_ignore 参数?

    1
    我们在 lo 上配置了 vip,正常情况下,其他设备发送 vip 的 arp 请求时,除了负载均衡设备会响应 arp 请求之外,后端服务器也会响应 vip 的 arp 请求,这样请求设备不知道哪个是准确的。我们在参数中配置 arp_ignore=1 之后,后端服务器只会响应目标IP地址为接收网卡上的本地地址的arp请求。由于vip配置在lo上,所以其他接口收到相关的arp请求都会忽略掉,这样保证了arp请求正确性。这也说明了为什么vip必须配置在lo接口上而不是其他接口上了。
  • 为什么需要配置 arp_announce 参数?

    1
    2
    当后端服务器向客户端发送响应数据包时,源地址和目的地址确定,通过目的地址查找路由后,发送网卡也是确认的,也就是说源MAC地址是确认的,目的MAC地址还不确定,需要获取下一跳IP对应的MAC地址,就需要发送arp请求了。发送的arp请求目的IP就是下一跳的地址,而源IP是什么呢?系统通常默认会取数据包的源IP作为arp的源IP。我们认真想一下,源IP不就是VIP吗,假设以VIP为源IP发送arp请求,那下一跳学习到的MAC地址和IP地址对应关系就会错乱,因为负载均衡设备上的VIP对应的MAC地址肯定与这个不同,导致整个系统的arp紊乱。
    而我们配置 arp_announce=2 后,操作系统在发送arp请求选择源IP时,就会忽略数据包的源地址,而选择发送网卡上最适合的本地地址作为arp请求的源地址。
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 ChpiTer
  • Powered by Hexo Theme Ayer

请我喝杯咖啡吧~

支付宝
微信