Keepalived详解之 - LVS(IPVS)管理工具ipvsadm使用指南
2019-12-01

ipvsadm是什么?

ipvsadm是用来配置、维护或者查看Linux内核当中virtual server table的一个工具, LVS(Linux virtual server)能基于一个集群当中的两个或者多个节点来创建弹性网络服务, 集群中的处于激活状态的节点能将服务请求重定向到一组实际提供服务的主机当中, 提供包括TCP和UDP两种协议, 三种数据包转发模式(NAT / tunneling / direct routing), 和八种负载均衡算法(round robin, weighted round robin, least-connection, weighted least-connection, locality-based least-connection, locality-based least-connection with replication, destination-hashing, and source-hashing).

使用方式

ipvsadm提供两种基本的使用格式, 中括号表示可选, 两种命令格式分别对应virtual server和real server

ipvsadm COMMOND [protocol] service-address [scheduling-method] [persistence options]

或者

ipvsadm command [protocol] service-address server-address [packet-forwarding-method] [weight options]

第一种命令格式用于配置虚拟服务(virtual service)和用于分配服务请求到真实服务器的算法, 另外一个可选项为用于持久化服务的持久化超时时间和网络掩码.

第二种命令格式用于配置与一个已经存在的虚拟服务器相关联的真实服务器, 当指定一个真实服务器时, 数据包转发方式和该真实服务器相对于该虚拟服务器下面的其他真实服务器的权重需要指定, 否则会采用默认值.

安装ipvsadm

[root@10-10-40-96 ~]# yum instal -y ipvsadm

命令参数说明

惯例是大写表示用于virtual server, 小写表示用于real server

-A, --add-service 添加virtual server, virtual server必须唯一(IP+端口+协议用于区分一个唯一的虚拟服务) -E, --edit-service 编辑虚拟服务 -D, --delete-service 删除一个虚拟服务, 包括与之关联的真实服务器 -C, --clear 清空虚拟服务表 -R, --restore 通过标准输入恢复虚拟服务表(IPVS table) -S, --save 以可以通过-R参数恢复的格式导出虚拟服务表到标准输出 -a, --add-server 添加一个真实服务器到一个虚拟服务 -e, --edit-server 在一个虚拟服务当中编辑一个真实服务器 -d, --delete-server 从一个虚拟服务当中移除一个真实服务器 -L, -l, --list 列出虚拟服务表, 默认是列出所有虚拟服务表, 若需要列出某服务表, 后面指定服务地址即可 -Z, --zero 清零一个所有服务的数据包 / 字节 / 速率计数器

示例

查看IPVS

[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.10.88.188:7480 wlc persistent 1800 -> 172.16.130.20:7480 Masq 1 0 0[root@10-10-88-192 ~]#

保存IPVS

默认是输出到标准输出, 可以重定向到文本保存, 方便后期再导入

[root@10-10-88-192 ~]# ipvsadm -S -n-A -t 10.10.88.188:7480 -s wlc -p 1800-a -t 10.10.88.188:7480 -r 172.16.130.20:7480 -m -w 1[root@10-10-88-192 ~]# ipvsadm -S -n > ipvs_info[root@10-10-88-192 ~]#清空IPVS

[root@10-10-88-192 ~]# ipvsadm -C[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn[root@10-10-88-192 ~]#

恢复(restore)IPVS

注意: 默认是从标准输入进行恢复

[root@10-10-88-192 ~]# cat ipvs_info | ipvsadm -R[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.10.88.188:7480 wlc persistent 1800 -> 172.16.130.20:7480 Masq 1 0 0[root@10-10-88-192 ~]#移除一个real server

[root@10-10-88-192 ~]# ipvsadm -d -t 10.10.88.188:7480 -r 172.16.130.20:7480[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.10.88.188:7480 wlc persistent 1800[root@10-10-88-192 ~]#

注: 移除real server之后会先将destination(endpoint)移到trash(暂存垃圾桶), 过一段时间再删除, 若这个期间这个real server又可以访问了则会从trash中拿回来继续用, 具体说明见IPVS源码注释https://elixir.bootlin.com/linux/v3.0/source/net/netfilter/ipvs/ip_vs_ctl.c, 下面为打开IPVS debug模式(debug_level=8)后dmesg -Hew的输出

[Sep26 11:08] IPVS: Enter: ip_vs_del_dest, net/netfilter/ipvs/ip_vs_ctl.c line 1079[ +0.000007] IPVS: Moving dest 172.16.130.20:7480 into trash, dest->refcnt=1[ +0.000002] IPVS: Leave: ip_vs_del_dest, net/netfilter/ipvs/ip_vs_ctl.c line 1101[ +11.076403] IPVS: Removing destination 0/172.16.130.20:7480 from trash添加一个real server

[root@10-10-88-192 ~]# ipvsadm -a -t 10.10.88.188:7480 -r 172.16.130.22:7480 -m[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.10.88.188:7480 wlc persistent 1800 -> 172.16.130.22:7480 Masq 1 0 0[root@10-10-88-192 ~]#添加一个virtual server

[root@10-10-88-192 ~]# ipvsadm -A -t 10.10.88.189:7480 -s wlc -p 1800[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.10.88.188:7480 wlc persistent 1800 -> 172.16.130.22:7480 Masq 1 0 0TCP 10.10.88.189:7480 wlc persistent 1800[root@10-10-88-192 ~]#移除一个virtual server

[root@10-10-88-192 ~]# ipvsadm -D -t 10.10.88.189:7480[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.10.88.188:7480 wlc persistent 1800 -> 172.16.130.22:7480 Masq 1 0 0

如果直接移除virtual server的话, 若有real server, real server也会一并移除掉

[root@10-10-88-192 ~]# ipvsadm -D -t 10.10.88.188:7480[root@10-10-88-192 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn[root@10-10-88-192 ~]#