Control y monitorización de Keepalived con ipvsadm

Ipvsadm permite administrar y tener control total de LVS (Linux Virtual Server), es decir, añadir, editar y eliminar virtual servers o real servers, cambiar algoritmos/scheduling de balanceo, peso de real servers para un servicio, exportar e importar la configuración activa, etc. Todo se realiza a tiempo real y sin necesidad de reiniciar o recargar ningún servicio.

Hay que tener en cuenta que no es lo mismo utilizar ipvsadm para gestionar LVS de forma directa que cuando utilizamos Keepalived para interactuar con LVS:

  • Ipvsadm + LVS: ipvsadm establece y mantiene toda la configuración de LVS.
  • Keepalived + LVS + (ipvsadm): Keepalived establece y mantiene toda la configuración de LVS. ipvsadm se puede utilizar para monitorizar el estado de Linux Virtual Server. Si se realiza algún cambio en LVS a través de ipvsadm, será efectivo pero no persistente al reinicio de Keepalived, que además puede sobreescribir la configuración en cualquier momento, por ejemplo, tras el reinicio de un real server.

Por ejemplo, con ipvsadm podemos temporalmente eliminar un real server de un balanceo:

# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  balanceo-web:http       wlc persistent 32400
-> realserver01:http    Route   1      0          0
-> realserver02:http    Route   1      0          0
# ipvsadm -d -t balanceo-web:http -r realserver01
# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  balanceo-web:http       wlc persistent 32400
-> realserver02:http    Route   1      0          0

La tabla de LVS se ha modificado y el realserver ya no forma parte del balanceo, pero si se reinicia keepalived, «realserver01» volverá a formar parte del servicio ya que la configuración está especificada en el fichero «keepalived.conf» y no es gestionada directamente por ipvsadm.

Una vez aclarado esto, vamos a ver qué podemos hacer con ipvsadm para monitorizar y controlar Keepalived con LVS.

Ver el estado de los servicios y balanceos (tabla LVS)

Para visualizar todos los balanceos configurados, real servers asociados, algoritmos de balanceo, pesos, etc utilizamos el comando ipvsadm seguido del parámetro «-L», «-l» o «–list»:

# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  virtualldap:ldap rr persistent 50
-> ldap01:ldap                 Masq    1      0          38
-> ldap02:ldap                 Masq    1      0          74
TCP  virtualweb:http rr persistent 50
-> web01:http                   Masq    1      7          51
-> web02:http                   Masq    1      1          10

Si queremos deshabilitar la resolución DNS y ver los puertos en lugar del nombre del servicio utilizamos el parámetro «-n»:

# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.99:386 rr persistent 50
-> 192.168.3.100:386                 Masq    1      0          38
-> 192.168.3.101:386                 Masq    1      0          74
TCP  192.168.1.100:80 rr persistent 50
-> 192.168.3.200:80                   Masq    1      7          51
-> 192.168.3.201:80                   Masq    1      1          10

Si necesitamos información concreta de un servicio podemos especificarlo con el parámetro de listar «-L», seguido del tipo de servicio (tcp, udp) y finalmente el virtual server (IP + Puerto):

Ejemplo TCP:

# ipvsadm -L --tcp-service 192.168.1.99:386
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.99:386 rr persistent 50
-> 192.168.3.100:386                 Masq    1      0          38
-> 192.168.3.101:386                 Masq    1      0          74

Ejemplo UDP:

# ipvsadm -L --udp-service 192.168.129:53
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
UDP  192.168.1.129:53 rr persistent 50
-> 192.168.3.112:53                 Masq    1      0          138
-> 192.168.3.111:53                 Masq    1      0          734

Visualizar estadísticas de tráfico

Por defecto, al listar la tabla de LVS podemos ver el número de conexiones activas e inactivas de cada real server. Como complemento a esta información podemos visualiza información de paquetes y bytes de entrada/salida con el parámetro «–stats»:

# 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.1.99:80                31438   215463   227039 47615155  109224K
-> 192.168.3.100:80                15266    98847   103952 21159207 44727177
-> 192.168.3.100:80                16172   116616   123087 26455948 64497234
[...]

También podemos filtrar por virtual server en lugar de mostrar todo:

# ipvsadm -L -n --stats  --udp-service 200.87.100.10:53
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
-> RemoteAddress:Port
UDP  192.168.1.215:53                3010M    1941M    1318M     812G    2988G
-> 192.168.3.200:53                4202M    1627M    1280M     456G    1690G
-> 192.168.3.201:53                3102M  313573K 37579267     355G    1297G

Mostrar conexiones, bytes y paquetes por segundo

El parámetro «–rate» permite visualizar información de conexiones por segundo, bytes por segundo y paquetes por segundo de cada servicio y sus real servers:

# ipvsadm -L -n --rate  --udp-service 200.87.100.10:53
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
-> RemoteAddress:Port
UDP  192.168.1.215:53                 4668     6614     6323   484559  1842310
-> 192.168.3.200:53                 2259     3211     3054   238426   902641
-> 192.168.3.201:53                 2409     3403     3269   246133   939669

Ver conexiones establecidas contra LVS

Para ver un listado de todas las conexiones establecidas en LVS se utiliza el comando «-c» seguido de «-L». Muestra una tabla con todas las conexiones y su protocolo, tiempo de expiración, IP de origen, Real Server de destino y servidor virtual/balanceo al que están conectados:

# ipvsadm -L -c -n
IPVS connection entries
pro expire state       source             virtual            destination
UDP 04:58  UDP         xxxxx:41652   192.168.1.215:53 192.168.1.200:53
UDP 04:58  UDP         xxxxx:12181   192.168.1.215:53 192.168.1.200:53
UDP 04:57  UDP         xxxxx:15861   192.168.1.215:53 192.168.1.201:53
UDP 04:56  UDP         xxxxx:6617    192.168.1.215:53 192.168.1.201:53
UDP 04:56  UDP         xxxxx:54503   192.168.1.215:53 192.168.1.201:53
UDP 04:53  UDP         xxxxx:59607   192.168.1.215:53 192.168.1.200:53
UDP 04:53  UDP         xxxxx:17682   192.168.1.215:53 192.168.1.200:53

Ver límites de número de conexiones por Real Server

LVS (y por consiguiente Keepalived) permite establecer límites máximos y mínimos de conexiones por Real Server. Para visualizar estos límites utilizamos el parámetro «–thresholds». Si no hay límites establecidos aparecerá el valor 0:

# ipvsadm -L -n --thresholds
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port            Uthreshold Lthreshold ActiveConn InActConn
-> RemoteAddress:Port
UDP  192.168.1.215:53 rr persistent 50
-> 192.168.3.200:53             0          0          0          16
-> 192.168.3.201:53             0          0          0          9

Modificación de configuracion de LVS, Virtual Servers y Real Servers

Hasta ahora todo lo que hemos visto era monitorización y consultas para ver el estado de los servicios, balanceos, real servers, etc. Como comentaba al principio de la entrada, también podemos realizar modificaciones a tiempo real pero si queremos hacerlas persistentes debemos aplicarlas en el fichero de configuración de keepalived (keepalived.conf). Esto en el caso de que usemos Keepalived.

Si usaramos ipvsadm directamente contra LVS aplicaríamos las configuraciones a tiempo real y luego las añadiríamos a nuestro script de arranque de ipvsadm:

$ ipvsadm-sav > ipvsadm.conf
$ ipvsadm-restore < ipvsadm.conf

Una vez que sabemos esto podemos realizar cualquier tiempo de configuración a tiempo real en LVS.

Crear un nuevo balanceo: virtual server (HTTP con round robin) + real servers:

# ipvsadm -A -t 192.168.1.100:80 -s rr
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.3.100:80 -m
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.3.101:80 -m
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.3.102:80 -m

Eliminar un Real Server de un balanceo/Virtual Server

# ipvsadm -d -t 192.168.1.100:80 -r 192.168.3.100:80

Editar la prioridad de un Virtual Server

# ipvsadm -e -t 192.168.1.100:80 -s rr -p 50

Editar el algoritmo (scheduler) de balanceo de un virtual server:

# ipvsadm -e -t 192.168.1.100:80 -s lc

En definitiva, se puede modificar cualquier parámetro a través de ipvsadm, siempre conociendo como aplicarlo de forma persistente según nuestra instalación. Para ver todos los parámetros y configuraciones disponibles revisad la página man:

# man ipvsadm