¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros y videos
  2. Alta disponibilidad en Linux
  3. Exposición y reparto
Extrait - Alta disponibilidad en Linux De la infraestructura a la orquestación de servicios (Heartbeat, Docker, Ansible, Kubernetes…)
Extractos del libro
Alta disponibilidad en Linux De la infraestructura a la orquestación de servicios (Heartbeat, Docker, Ansible, Kubernetes…) Volver a la página de compra del libro

Exposición y reparto

Exponer sus servicios

1. Problemática

En el capítulo Los contenedores, vimos cómo crear imágenes reutilizables de nuestra aplicación eni-todo y cómo, usando contenedores, desplegarlas en uno o más servidores. Pero aún no hemos visto cómo acceder a ellas desde un único punto de entrada. Necesitamos resolver varios problemas.

En primer lugar, cada contenedor, una vez iniciado, tiene su propia dirección IP en una red que es local a la máquina y no está enrutada, es decir, no es accesible desde ningún otro punto de la red. Tenemos que encontrar la manera de que la aplicación que se ejecuta de forma aislada sea accesible a través de, por ejemplo, la dirección IP del servidor.

En segundo lugar, el servicio de la aplicación eni-todo se distribuye ahora en, al menos, dos servidores, para garantizar su disponibilidad en caso de pérdida de una de las máquinas. Se necesita un único punto de acceso: una dirección, que reenviará las peticiones a uno u otro servidor, pero que también debe ser capaz de detectar la indisponibilidad de la aplicación en uno o varios servidores y reenviar el tráfico a los que aún estén activos.

Si el servicio se va a exponer en Internet, debe tener una dirección IP pública.

Y, por último, todos los servicios deben ser redundantes: debemos...

Reverse proxy

1. ¿Por qué utilizar un reverse proxyreverse proxy?

Cada contenedor iniciado en el servidor tiene su propia dirección IP. Esta dirección se puede obtener simplemente utilizando el comando docker y el nombre o identificador del contenedor:

$ docker container ps 
CONTAINER ID   IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
296364ae3c93   registry.diehard.net:5000/tomcat-eni-todo:v24.04-eni-
todo-tomcat-mariadb-env   "catalina.sh run"   16 minutes ago   Up 
16 minutes   0.0.0.0:8080->8080/tcp   tomcat-production-eni-todo_1_
v24.04-eni-todo-tomcat-mariadb-env 
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 296364ae3c93 
172.17.0.2 

Desde el propio servidor, puede comprobar que el servicio que se ejecuta en el contenedor funciona, con un simple curl:

$ curl -I http://172.17.0.2:8080/eni-todo/ 
HTTP/1.1 200 
Set-Cookie: JSESSIONID=5EFB90378D2336F11E2FFF6348BD6510; 
Path=/eni-todo; HttpOnly 
Content-Type: text/html;charset=UTF-8 
Content-Language: en 
Content-Length: 3333 
Date: Sat, 16 Mar 2024 12:45:40 GMT 

De momento, intentar lo mismo desde la dirección IP del servidor también funciona, porque hemos asociado el puerto 8080 del servidor con el del contenedor que hemos iniciado. Impedir el acceso directo a la aplicación es una mala idea. Iniciar varias aplicaciones utilizando el puerto 8080 es imposible: varias aplicaciones no pueden escuchar directamente en el mismo par IP:Puerto.

$ curl -I http://192.168.56.30:8080/eni-todo/ 
HTTP/1.1 200 
$ nc -l -s 192.168.56.30 -p 8080 
nc: Address already in use 

También puede iniciar el contenedor utilizando la red del host, es decir, el servidor. En este caso, el contenedor utiliza las direcciones y puertos del servidor, por lo que no hay aislamiento de red. Pero también en este caso, dos contenedores no pueden utilizar el mismo puerto del host.

$ docker run --network=host ... 

Podríamos considerar otras soluciones de bajo nivel, con Netfilter, NAT (Network Address Translation), pero volveríamos a encontrarnos con los mismos problemas. Necesitamos utilizar una solución que permita a varias...

Reparto de la carga

1. Presentación

Ahora que los servicios en contenedores son accesibles desde la dirección IP de un host, necesitamos exponer todos estos servicios y, por lo tanto, todos los hosts, a todos los clientes, ya sea en la red corporativa (la intranet) o en una red pública (Internet). En las pruebas anteriores sólo se utilizaba un único host. Sin embargo, el servicio se desplegará en, al menos, dos hosts. No vamos a exponer directamente un servidor de aplicaciones en Internet. Como los servicios están repartidos entre varios servidores, es necesario un proceso de decisión para repartir la carga entre todos los servicios.

El objetivo de un load balancer o repartidor de carga es distribuir las conexiones de los clientes entre varios servidores o servicios, según criterios de decisión. El repartidor de carga suele tener, al menos, dos interfaces de red: una accesible desde la red que expone la dirección IP a los clientes y otra en una subred interna dedicada, a través de la cual accede a los hosts (puede tener una sola interfaz si la IP expuesta está en la misma subred que los servidores).

El primer papel del repartidor de carga es el de proxy: enrutar las conexiones a las aplicaciones a los hosts correctos, de acuerdo con reglas basadas, como con un proxy de host, en el nombre del servicio. En este sentido, su papel es similar al del reverse proxy Nginx.

Su segunda función...

Solución de reparto de carga

1. Elección de productos

Se necesitan al menos tres productos para implementar esta arquitectura. El propio repartidor de carga debe gestionar la conexión de un cliente a un servicio y devolverla a un host (el host, a través de su reverse proxy, la devuelve a un contenedor). Como esto implica la gestión de varios tipos de protocolos y reglas basadas en estos protocolos (agrupación de direcciones y enrutamiento basado en nombres de host), esto descarta automáticamente una solución basada únicamente en las capas 3 y 4 del modelo OSI (Open Systems Interconnection). Esto significa que Keepalived no puede ser seleccionado para su papel de dispatcher (repartidor). Utilizaremos la mejor solución actual: FRRouting

Las direcciones IP de servicio se pueden configurar manualmente en las interfaces correspondientes. Pero, ¿cómo cambiarlas de un dispatcher a otro? Aquí es donde el protocolo VRRP (Virtual Router Redundancy Protocol) realmente entra en acción. Utilizaremos el módulo asociado Keepalived, que se utilizará para gestionar un router virtual formado por, al menos, dos routers físicos y que se encargará de la alta disponibilidad de las direcciones IP.

Exponer una dirección IP en Internet es diferente de exponerla en una red privada. La dirección se debe anunciar a los distintos routeres a través de protocolos especializados como OSPF y BGP. Estos protocolos se pueden configurar utilizando Quagga.

2. HAProxy

a. Presentación

HAProxy es un paquete de software de código abierto desarrollado originalmente por Willy Tarreau. La primera versión se publicó en 2001 y proporciona un servicio de reparto de carga (load balancing) y de proxy de alta disponibilidad. Gestiona los protocolos HTTP (nivel 7) y TCP (nivel 4). Está escrito en C, es muy potente, requiere muy pocos recursos (memoria y procesador) y aguanta muy bien la carga. Lo utiliza un enorme número de sitios web, algunos de los cuales lo anuncian públicamente: GitHub, Reddit, Slack, Twitter, Tumblr, Bitbucket, GoDaddy, Amazon, etc. Y miles de otras empresas utilizan HAProxy para multitud de proyectos internos, (por ejemplo, OpenShift o Ingress Kubernetes), lo que lo convierte en el repartidor de carga más utilizado del mundo.

Sus prestaciones son impresionantes:...

Exposición en Internet

Mientras que todo es relativamente sencillo en una red interna, donde una dirección IP es única en una subred determinada, las cosas son totalmente distintas cuando se trata de una IP expuesta en Internet: es una IP pública.

En una red privada, suele haber tres bloques de direcciones que se pueden utilizar a voluntad y como mejor nos convenga, pero que no son enrutables en Internet. Por ejemplo, en IPv4, los bloques más conocidos son los de las clases antiguas:

  • 10.0.0.0/8

  • 172.16.0.0/12

  • 192.168.0.0/16

También existen otros bloques para usos específicos (loop/loopback, multicast, broadcast, tests, 6to4, etc.). Encontrará la lista de estos bloques de direcciones reservadas en el RFC 6890 en https://www.rfc-editor.org/info/rfc6890.

Aparte de estos bloques reservados, todas las direcciones son públicas y se pueden utilizar en Internet. Esto no significa que podamos coger una IP al azar si parece libre y utilizarla. Las direcciones hay que pagarlas y las organizaciones son responsables de gestionar su uso. IANA (Internet Assigned Numbers Authority) distribuye bloques a los RIR (registros regionales de internet): RIPE-NCC para Europa, APNIC para Asia-Pacífico, ARIN para Norteamérica, LACNIC para Centroamérica y Sudamérica y AfriNIC para África.

Cada RIR vende bloques de direcciones a quien desee comprarlas y los compradores son libres de utilizarlas como deseen. Nuestro ISP, por ejemplo, puede proporcionarnos...

Solución de exposición en Internet con FRRouting

El papel de Ops o DevOps no es (al menos en teoría) configurar todo el enrutamiento BGP u OSPF por sí mismo, sino que se encarga de anunciar sus rutas e IPs (públicas en este caso) a los demás routeres de la infraestructura que, en principio, ya están instalados. En cambio, sí necesita conocer los equipos a los que debe anunciar sus rutas.

Aquí elegiremos anunciar nuestras direcciones IP públicas a través del protocolo OSPF. Los routeres con los que nos comuniquemos tendrán que ponerse de acuerdo para exponer la información recibida en Internet a través del protocolo BGP.

Es posible configurar Linux como un enrutador que acepte todos estos protocolos. El paquete de software de enrutamiento FRRouting implementa OSPF, RIP, BGP e IS-IS y otras, incluso en IPv4 y IPv6. Lo que nos interesa aquí es OSPF.

1. Implementación

En este apartado, la simplicidad es la clave para una mejor comprensión.

Los repartidores de carga se basan en VRRP (Keepalived). Portarán direcciones IP públicas a una interfaz de red dedicada que está directamente expuesta y, por tanto, accesible en Internet. Esto significa que configuraremos directamente una o más IPs públicas en esta interfaz, como si fueran cualquier otra IP y, de esta manera, estas direcciones serán visibles con un comando ip addr show.

Otros métodos incluyen la configuración de direcciones en la interfaz loopback, la modificación de las tablas ARP y la configuración dinámica del kernel para aceptar paquetes IP no configurados en las interfaces. FRRoutingt ambién se puede utilizar para configurar interfaces.

Pero como hemos utilizado la configuración VRRP para la alta disponibilidad de nuestras VIPs, vamos a hacer lo mismo para configurar nuestras direcciones IP públicas. El papel de FRRouting es anunciar estas direcciones a los otros routeres, dándoles la ruta para acceder a ellas desde Internet.

Por tanto, nuestros balanceadores de carga tienen una tercera capa añadida, OSPF, para anunciar las IPs públicas que llevan en Internet, aquellas que han sido configuradas como VIPs en los routeres maestros VRRP.

2. Instalación y configuración

El paquete FRRouting instala todos los componentes necesarios.

$ sudo apt install...