LVS的NAT模式、DR模式搭建
运维之道 | LVS原理详解
lvs工作模式: -m(Nat) | -g(DR)| -i(Tun) | -b(Fullnat)
Nat:网络地址映射
DR:直接路由
LVS工作原理:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接收到请求,返回给用户。对于用户来说,看不到WEB后端具体的应用。
NAT模式
DR模式
一、主机IP规划
需要创建:1台LVS服务器
、2台Apache服务器
、1台用户访问虚拟机
、1个虚拟IP地址(VIP)
服务器说明 | IP地址 |
---|---|
LVS服务器(DIP) | 192.168.182.132 |
虚拟IP地址(VIP) | 192.168.182.111 |
Apache服务器1(RIP) | 192.168.182.130 |
Apache服务器2(RIP) | 192.168.182.131 |
用户端(CIP) | 192.168.182.133 |
DS | LVS调度器 |
RS | WEB服务器 |
二、LVS服务安装
LVS服务端
LVS可以通过yum命令安装,或者通过源码编译的方式安装,在此选择yum安装。
1、在LVS服务端安装lvs服务
[root@localhost ~]# yum -y install ipvsadm
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
*****自动安装过程略****
Installed:
ipvsadm-1.27-7.el7.x86_64
Complete!
2、创建软连接
ipvsadm在编译的时候需要使用内核文件
[root@localhost ~]# ln -s /usr/src/kernels/kernels/3.10.0-957.el7.x86_64/ /usr/src/linux
[root@localhost ~]# ll /usr/src/linux
lrwxrwxrwx. 1 root root 39 1月 1 16:01 /usr/src/linux -> /usr/src/kernels/3.10.0-957.el7.x86_64/
注:如果没有/usr/src/kernelskernels/3.10.0-957.el7.x86_64/路径,可能是因为缺少kernels/3.10.0-957.el7.x86_64/软件包,可以通过命令yum -y install kernerl-devel
安装。若yum源中没有安装包,可通过获取镜像中的rpm包安装:方法如下:
[root@localhost ~]# mkdir /mnt/abc
[root@localhost ~]# mount /dev/cdrom /mnt/abc/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# cd /mnt/abc/
[root@localhost abc]# cp Packages/kernel-3.10.0-957.el7.x86_64.rpm /usr/local/src
[root@localhost src]# rpm -ivh kernel-3.10.0-957.el7.x86_64.rpm
3、检测是否安装完毕
[root@localhost ~]# rpm -qa ipvsadm
ipvsadm-1.27-7.el7.x86_64
4、查看内核是否有ip_vs服务运行
[root@localhost ~]# lsmod |grep ip_vs
ip_vs_wrr 12697 1
ip_vs 145497 3 ip_vs_wrr
nf_conntrack 133095 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
注:如果没有以上四个输出,可以使用命令ipvsadm
或者modprobe ip_vs
命令重新加载。
三、Apache服务器搭建
两台服务器均要配置
Apache服务器1-2
1、在两台Apache服务器中部署httpd
Apache服务器搭建步骤
2、修改httpd发布界面
RealServer1:echo ”I am RealServer1 192.168.182.130”>/var/www/html/index.html
RealServer2:echo “I am RealServer2 192.168.182.131”>/var/www/html/index.html
LVS集群配置 - DS端
四、手动配置LVS服务
1、清空以前的旧配置:
[root@localhost ~]# ipvsadm -C
2、为LVS服务器添加一个虚拟IP地址:
[root@localhost ~]# ip addr add 192.168.182.111/24 dev ens33 label ens33:0
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.182.132 netmask 255.255.255.0 broadcast 192.168.182.255
inet6 fe80::de64:22e8:c40e:f44b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:8c:11:61 txqueuelen 1000 (Ethernet)
......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.182.111 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:8c:11:61 txqueuelen 1000 (Ethernet)
3、添加一个虚拟vserver:
添加一台新的虚拟服务器,并以wrr(加权轮询)的算法调度
[root@localhost ~]# ipvsadm -A -t 192.168.182.111:80 -s wrr
参数说明
:
-A
:–add-service,表示添加一个虚拟服务器-t
:–tcp-service,指定这是一个tcp的虚拟服务器-u
:–udp-service,指定这是一个udp的虚拟服务器192.168.182.111:80
:表示提供服务的ip地址以及端口号-s
:–scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc
4、为服务器添加real server:
向虚拟服务上添加一台真实服务器并指向80端口
[root@localhost ~]# ipvsadm -a -t 192.168.182.111:80 -r 192.168.182.130:80 -g -w 1
[root@localhost ~]# ipvsadm -a -t 192.168.182.111:80 -r 192.168.182.131:80 -g -w 1
[root@localhost ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http wrr
-> 192.168.182.130:http Route 1 0 0
-> 192.168.182.131:http Route 1 0 0
LVS集群配置 - RS端
两台服务器均要配置
1、绑定LVS服务器的VIP
在网卡lo绑定虚拟IP,该虚拟IP同LVS服务器的虚拟IP,即192.168.182.111/24
[root@localhost ~]# ip addr add 192.168.182.111/32 dev lo label lo:0
[root@localhost ~]# route add -host 192.168.182.111 dev lo
[root@localhost ~]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
......
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.182.111 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
2、设置ARP抑制 (NAT模式不需要配置)
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
3、打开路由转发功能
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
注:抑制参数说明
arp_ignore | 定义目标地址为本地IP的ARP询问不同的应答模式 |
---|---|
0 | 默认值,回应任何网络接口上对任何本地IP地址的arp查询请求 |
1 | 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 |
2 | 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 |
3 | 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 |
4-7 | 保留未使用 |
8 | 不回应所有(本地地址)的arp查询 |
arp_announce | 对网络接口上,本地IP地址发出的,ARP回应,作出相应级别的限制。确定不同程序的限制,宣布对来自本地源IP地址发出的ARP请求接口 |
---|---|
0 | 默认值,在任意网络接口(eth0,eth1,lo)上任何本地地址 |
1 | 尽量避免不在该网络子网段的地址作出arp回应。当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访者IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理 |
2 | 对查询目标使用最适当的本地地址,在此模式下忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有网络接口的子网中外出访问子网中包目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,限制了使用本地VIP地址作为优先的网络接口 |
结果服务验证
五、在用户端(192.168.182.133)访问192.168.182.111:80
,查看结果是否轮循。
六、LVS拓展
1、LVS配置及规则保存备份、清理、导入恢复
(上述四-4步骤)
- LVS配置及规则保存备份
[root@localhost ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@localhost sysconfig]# cat ipvsadm
-A -t 192.168.182.111:80 -s wrr
-a -t 192.168.182.111:80 -r 192.168.182.130:80 -m -w 1
-a -t 192.168.182.111:80 -r 192.168.182.131:80 -m -w 1
- 将LVS配置及规则清理
[root@localhost ~]# ipvsadm -C
- 将上述备份LVS配置及规则进行导入
[root@localhost ~]# ipvsadm-restore </etc/sysconfig/ipvsadm
原ipvs规则存放于
:/proc/net/ip_vs
原ipvs连接存放于
:/proc/net/ip_vs_conn
2、elinks
测试工具(同curl
命令)
[root@localhost ~]# yum install -y elinks ///安装elinks测试工具
轮询算法
:
[root@localhost ~]# elinks 192.168.182.111 --dump
”I am RealServer2 192.168.182.131”
[root@localhost ~]# elinks 192.168.182.111 --dump
”I am RealServer1 192.168.182.130”
[root@localhost ~]# elinks 192.168.182.111 --dump
”I am RealServer2 192.168.182.131”
[root@localhost ~]# elinks 192.168.182.111 --dump
”I am RealServer1 192.168.182.130”
3、ipvsadm常用命令
- 查看分发情况
[root@localhost ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.182.111:80 140 673 389 69306 53676
-> 192.168.182.130:80 70 339 195 34816 27076
-> 192.168.182.131:80 70 334 194 34490 26600
- 查看速率
[root@localhost ~]# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.182.111:80 0 0 0 0 0
-> 192.168.182.130:80 0 0 0 0 0
-> 192.168.182.131:80 0 0 0 0 0
- 清空IPVS数据
[root@localhost ~]# ipvsadm -Z
- 清空IPVS规则
[root@localhost ~]# ipvsadm -C
- 超时时间用ipvsadm --set tcp tcpfin udp设置
[root@localhost ~]# ipvsadm --set 120 20 100
`表示tcp空闲等待时间为120 秒`
`客户端关闭链接等待时间为20秒`
`udp空闲等待为100秒`
ipvsadm--help
ipvsadm命令选项解释:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived的VRRP 功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息
_________________________________________________________________________________________
其他的选项:
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS 目前的连接 如:ipvsadm -L -c
--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
--numeric -n 输出IP 地址和端口的数字形式
翻译至:https://blog.51cto.com/13178102/2063272
翻译至:https://ke.qq.com/course/424396?term_id=100506501&taid=3666175494355404
翻译至:https://blog.51cto.com/orzorz/1701270