keepalived詳解 - LVS(IPVS)管理工具ipvsadm簡介

南喬峰發表於2019-04-17

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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 -n
IP 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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
  -> 172.16.130.22:7480 Masq 1 0 0
TCP 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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@10-10-88-192 ~]#
複製程式碼

相關文章