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