Skip to main content

IPVSADM

LVS mode tunneling

LVS es un proyecto de código abierto que se inició en 1998, con el objetivo principal de crear alta disponibilidad y soluciones de equilibrio de carga utilizando clústeres formados por hardware básico.

LVS vía IP Tunneling es una solución mucho mejor escalable en comparación con LVS a través de NAT. Esto se debe a dos razones principales.

  • Load Balencer no realiza la reescritura múltiple de los paquetes IP.
  • La respuesta real nunca se envía a través del equilibrador de carga.

Instalación

Para instalar el ipvsadm instalar simplemente el paquete:  yum install ipvsadm

Configuración

La configuración es muy similar de la forma habitual en la que configuramos el ipvsadm, pero la diferencia es que en este caso en los nodos se configura un dispositivo del tipo IPIP.

En los nodos se configura un dispositivo "tunX" con el tipo ipip y la IP balanceada (en este caso la IP Balanceada es la 198.74.61.31, fijarse que en la mascara hay un 255.255.255.255 independientemente de la red!)

# cat /etc/sysconfig/network-scripts/ifcfg-tunl0 
   DEVICE=tunl0
     TYPE=ipip
   # this is the shared IP from the Load Balancer
   IPADDR=198.74.61.31
   NETMASK=255.255.255.255
   ONBOOT=yes

En caso que al levantar se queje del tipo, cargar el módulo ipip y probar de levantar de nuevo la interfaz:

# modprobe ipip ; ifup tunl0 (si funciona, poner “insmod” para que lo cargue al arrancar) 

En el balanceador, configurar la IP de forma habitual cat ifcfg-eth0:0

DEVICE="eth0:0"
NAME="eth0:0"
ONBOOT="yes"
BOOTPROTO="none"
NM_CONTROLLED="no"
IPV6INIT="no"
IPADDR=198.74.61.31
#GATEWAY=198.74.61.1<--IMPORTANTE NO GATEWAY
PREFIX=24

En la configuración del ipvsadm, otro cambio a tener en cuenta son los modos de balanceo:

-g, --gatewaying  Use gatewaying (direct routing). This is the default.  
-i, --ipip  Use ipip encapsulation (tunneling).
-m, --masquerading  Use masquerading (network access translation, or NAT).


Ejemplo:

cat /etc/sysconfig/ipvsadm
#-A -t 198.74.61.31:80 -s rr
#-a -t 198.74.61.31:80 -r 172.104.216.107:80 -g -w 1
#-A -t 198.74.61.31:443 -s rr
#-a -t 198.74.61.31:443 -r 172.104.216.107:443 -g -w 1
-A -t 198.74.61.31:6669 -s rr
-a -t 198.74.61.31:6669 -r 172.104.216.107:6669 -i -w 1


Un punto importante al configurar, vigilar con las rutas que hay , por ejemplo:

route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         198.74.61.1     0.0.0.0         UG    0      0        0 eth0<-- OJO!!
0.0.0.0         96.126.110.1    0.0.0.0         UG    100    0        0 eth0<-- OJO!!
96.126.110.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
172.104.216.0   198.74.61.1     255.255.255.0   UG    0      0        0 eth0
198.74.61.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0   
En este caso tenemos dos gateways, por las públicas, esto no permite enrutar correctamente por lo que el balanceo no funcionará!
route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         96.126.110.1    0.0.0.0         UG    100    0        0 eth0
96.126.110.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
198.74.61.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
En este punto el gateway por defecto únicamente está en la IP no balanceada!

Arranque y parada del servicio

Cuidado con el script de arranque que al hacer un restart limpia las reglas y machaca el fichero de configuración (he dejado una copia en /root/copia_ipvsadm). Si pasa eso simplemente hacer limpieza de las reglas,recuperar el fichero de la carpeta de root y volver a aplicarlas con un restore.

Para limpiar las reglas hacer:

# ipvsadm -C 

Y para cargar la conf:

# ipvsadm-restore < /etc/sysconfig/ipvsadm

Verificar que se han cargado correctamente lanzando:

# ipvsadm -Ln 
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  74.207.226.17:80 rr
 -> 173.230.128.150:80           Tunnel  1      0          5         
 -> 173.230.130.118:80           Tunnel  1      0          5         
 -> 173.230.133.22:80            Tunnel  1      0          5         
 -> 173.230.133.56:80            Tunnel  1      0          5         
 -> 173.230.133.253:80           Tunnel  1      0          5         
TCP  74.207.226.17:443 rr
 -> 173.230.128.150:443          Tunnel  1      468        3578      
 -> 173.230.130.118:443          Tunnel  1      441        3579      
 -> 173.230.133.22:443           Tunnel  1      447        3585      
 -> 173.230.133.56:443           Tunnel  1      428        3608      
 -> 173.230.133.253:443          Tunnel  1      437        3582

Si en lugar de Tunnel saliera Route es que hemos configurado el balance directo con un -g en lugar de un -i:

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  74.207.226.17:80 rr
 -> 173.230.130.118:80           Route   1      0          0         
 -> 173.230.128.150:80           Route   1      0          0         
 -> 173.230.133.22:80            Route   1      0          1         
 -> 173.230.133.56:80            Route   1      0          0         
 -> 173.230.133.253:80           Route   1      0          0

En todos los clientes la conf que tiene que estar en el sysctl.conf:

net.ipv4.conf.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.tunl0.arp_announce=2
net.ipv4.conf.tunl0.arp_filter=0
net.ipv4.conf.tunl0.arp_ignore=3