Balanceo de cargas interno mediante HAProxy en Google Compute Engine

Esta solución abarca la configuración de un balanceador de cargas interno que utiliza HAProxy en una instancia dedicada de Compute Engine para distribuir solicitudes HTTP en un conjunto de tres instancias de Compute Engine que ejecutan Apache Web Server.

Un balanceador de cargas acepta el tráfico de red entrante y lo distribuye entre un grupo de servidores de aplicaciones. Por ejemplo, el servicio de balanceo de cargas de Google Compute Engine distribuye el tráfico entrante de Internet a un grupo de instancias de Compute Engine. El siguiente diagrama muestra cómo funciona el balanceo de cargas de red de Compute Engine.

Diagrama que describe el balanceo de cargas de red de Compute Engine

Un balanceador de cargas interno distribuye el tráfico de red en una red privada que no está expuesta a Internet. El balanceo de cargas interno es útil no solo en las aplicaciones de intranet en las que todo el tráfico permanece en una red privada, sino también en las aplicaciones web complejas en las que el frontend envía solicitudes a los servidores de backend con una red privada.

Puedes usar Compute Engine para crear tu propio balanceador de cargas interno con un balanceador de cargas de software. Una forma de implementar ese balanceador de cargas es mediante HAProxy, un balanceador de cargas de software de código abierto, en una instancia de Compute Engine. En el siguiente diagrama, se muestra una descripción de alto nivel de cómo usar HAProxy para el balanceo de cargas interno en Google Cloud Platform.

Diagrama de alto nivel de HAProxy como un balanceador de cargas interno

Las flechas verdes continuas en el diagrama representan el tráfico en una red privada. El servidor HAProxy actúa como un balanceador de cargas interno porque no está expuesto a Internet. El servidor HAProxy recibe solicitudes en la red privada y las distribuye en un grupo de servidores de backend a los que solo se puede acceder a través de direcciones IP internas.

Esta solución crea un total de cinco instancias de Compute Engine: una para HAProxy, tres servidores de backend de Apache y una microinstancia destinada a realizar pruebas. En el siguiente diagrama, se muestra cómo interactúan las cinco instancias.

Diagrama detallado de HAProxy como un balanceador de cargas interno

Consideraciones de confiabilidad

La ejecución de HAProxy en su propia instancia crea un punto único de falla, por lo que usaremos la API de Instance Group Manager de Compute Engine, actualmente en versión Beta, para mantener el balanceador de cargas en ejecución. El administrador de grupo de instancias supervisa el estado de la instancia de Compute Engine de HAProxy y vuelve a crearla si deja de ejecutarse.

Sin embargo, el hecho de que se esté ejecutando la instancia subyacente del servidor HAProxy no garantiza que se esté ejecutando el servicio del balanceador de cargas de HAProxy. Para garantizar que el servicio HAProxy se reinicie en caso de que falle, usaremos systemd, una herramienta de administración del sistema que forma parte de la instalación predeterminada de Debian 9.

Objetivos

  • Configurar tres servidores de backend de Apache
  • Configurar un grupo de instancias administrado de una instancia de Compute Engine que ejecute HAProxy
  • Configurar una microinstancia de Compute Engine con una dirección IP externa para la prueba
  • Configurar HAProxy para balancear las cargas del tráfico a los servidores de backend de Apache

Requisitos previos

  1. Crea un nuevo proyecto de Google Cloud Platform Console para facilitar la limpieza.

  2. Utiliza Google Cloud Platform Console para habilitar las API de Compute Engine y de Instance Group Manager.

  3. Instala el SDK de Google Cloud.

  4. Configura tu lugar de trabajo para que los comandos sean menos detallados. Sustituye los valores de project-id y my-zone de tu proyecto en los siguientes comandos.

    me@local:~$ gcloud config set project project-id
    me@local:~$ gcloud config set compute/zone my-zone
    

Cómo crear un grupo de tres servidores de backend de Apache

Puedes usar un balanceador de cargas interno para distribuir el tráfico a una amplia variedad de recursos informáticos, como servidores de bases de datos, cachés de clave-valor y servidores web. En esta solución, utilizamos un grupo de tres servidores web que ejecutan Apache Web Server. En una solución posterior, demostraremos cómo usar un balanceador de cargas interno con un grupo de servidores backend de ajuste de escala automático.

Cómo crear una imagen personalizada que contenga el servidor Apache

Sigue estos pasos a fin de crear una imagen personalizada para los servidores backend.

  1. Crea una instancia de Compute Engine a fin de usarla como base para la imagen personalizada.

    me@local:~$ gcloud compute instances create apache-base --image-project debian-cloud --image-family debian-9
    
  2. Ingresa a la instancia y, luego, instala Apache2.

    me@local:~$ gcloud compute ssh apache-base
    apache-base:~$ sudo apt-get update && sudo apt-get install -y apache2
    apache-base:~$ exit
    
  3. Cancela la instancia, pero conserva el disco de arranque.

    me@local:~$ gcloud compute instances delete apache-base --keep-disks boot
    
  4. Crea la imagen personalizada con el disco fuente que acabas de crear.

    me@local:~$ gcloud compute images create apache-base-image --source-disk apache-base
    

Cómo crear tres servidores de backend de Apache basados en la imagen personalizada

Ejecuta el siguiente comando para crear tres servidores de backend que ejecuten el servidor Apache.

me@local:~$ gcloud compute instances create apache1 apache2 apache3 \
--image apache-base-image --no-address \
--metadata startup-script='#! /bin/bash
cat << _EOF_ > /var/www/html/index.html
This is $(hostname)
_EOF_'

La opción --no-address genera instancias que no tienen direcciones IP externas. La opción --metadata incluye una secuencia de comandos de inicio que edita la página de inicio de cada servidor Apache para que imprima el nombre de la instancia. Esto facilita verificar si el balanceador de cargas está distribuyendo solicitudes a los tres servidores backend.

Compute Engine muestra los nombres de los servidores y sus direcciones IP internas. Anota las direcciones IP internas de cada uno de los tres servidores backend. Las necesitarás para el archivo de configuración de HAProxy.

Cómo crear una microinstancia para la prueba

No puedes usar tu máquina de desarrollo para probar el balanceador de cargas y los servidores de backend, porque no tienen direcciones IP externas. Sigue estos pasos a fin de crear una microinstancia que tenga una dirección IP externa para que puedas probar los servidores de backend y el balanceador de cargas.

  1. Crea la instancia de prueba con --machine-type configurado como f1-micro.

    me@local:~$ gcloud compute instances create test-instance --machine-type f1-micro
    
  2. Establece una conexión de SSH con la instancia test-instance :
    gcloud compute ssh test-instance
  3. Usa curl para comprobar los servidores web de backend.

    me@test-instance:~$ curl apache1
    me@test-instance:~$ curl apache2
    me@test-instance:~$ curl apache3
    me@test-instance:~$ exit
    

Cómo crear un balanceador de cargas interno que ejecute HAProxy

En esta solución, el servicio HAProxy se ejecuta en una instancia dedicada de Compute Engine. A fin de reducir el riesgo de tener un único punto de falla, podemos tomar medidas para proteger el estado tanto de la instancia de Compute Engine como del servicio HAProxy en sí.

Para garantizar que la instancia de Compute Engine subyacente se siga ejecutando, usaremos un grupo de instancias administrado. Si la instancia de HAProxy está en un grupo de instancias administrado, el administrador de grupos de instancias comprueba el estado del servidor y vuelve a crear la instancia si deja de ejecutarse. El administrador de grupos de instancias recrea la imagen incluso si usas el comando gcloud compute instances o la API de Compute Engine para detener o cancelar la instancia. Sin embargo, si usas el comando gcloud compute instance-groups managed delete-instances o la API de Instance Group Manager para borrar la instancia, la instancia permanece borrada.

Puedes crear un grupo de instancias administrado en tres pasos. Primero, crea una imagen personalizada. Segundo, usa la imagen personalizada para crear una plantilla de instancias. Tercero, usa la plantilla de instancias para crear un grupo de instancias administrado.

A fin de garantizar que el servicio HAProxy siga funcionando, nos aseguraremos de que el archivo de configuración de la unidad del servicio HAProxy esté configurado para reiniciarse siempre. Si se configura correctamente, systemd reinicia inmediatamente un servicio si el proceso se interrumpe, sale o se agota el tiempo.

Sigue estos pasos para crear la imagen personalizada de HAProxy, la plantilla de instancias y el grupo de instancias administrado.

Cómo crear la imagen base para la instancia de HAProxy

  1. Utiliza la imagen de Debian-9 para crear una instancia de Compute Engine.

    me@local:~$ gcloud compute instances create haproxy-base --image-project debian-cloud image-family debian-9
    
  2. Ingresa a la instancia y, luego, instala HAProxy.

    me@local:~$ gcloud compute ssh haproxy-base
    haproxy-base:~$ sudo apt-get update && sudo apt-get -y install haproxy
    
  3. Configura HAProxy agregando la lista de servidores de backend al archivo de configuración. Reemplaza internal-ip por las direcciones IP internas coincidentes que anotaste en un paso anterior.

    haproxy-base:~$ echo -e "\n\n# Listen for incoming traffic
    listen apache-lb *:80
        mode http
        balance roundrobin
        option httpclose
        option forwardfor
        server apache1 $(getent hosts apache1 | awk '{print $1}'):80 check
        server apache2 $(getent hosts apache2 | awk '{print $1}'):80 check
        server apache3 $(getent hosts apache3 | awk '{print $1}'):80 check
    " | sudo tee -a /etc/haproxy/haproxy.cfg
    

Si olvidaste sustituir las direcciones IP reales por los tres casos de internal-ip antes de ejecutar el comando, usa un editor de texto para reemplazarlas antes de continuar.

Cómo confirmar que el servicio HAProxy está configurado para reiniciarse siempre

  1. Usa un editor de texto para ver un archivo llamado haproxy-check.sh.

    haproxy-base:~$ sudo nano /lib/systemd/system/haproxy.service
    
  2. Confirma que Restart=always aparece en la sección [Service]. Agrega Restart=always si no está en la lista.

    [Service]
    Environment=CONFIG=/etc/haproxy/haproxy.cfg
    ...
    Restart=always
    
  3. Sal del archivo, guarda los cambios y sal de shell.

    haproxy-base:~$ exit
    

Cómo crear la imagen personalizada

Utiliza el mismo procedimiento que usaste en la creación de la imagen personalizada del servidor Apache en la creación de la imagen personalizada para el servidor HAProxy.

  1. Cancela la instancia, pero conserva el disco de arranque.

    me@local:~$ gcloud compute instances delete haproxy-base --keep-disks boot
    
  2. Crea la imagen personalizada con el disco fuente que acabas de crear.

    me@local:~$ gcloud compute images create haproxy-base-image --source-disk haproxy-base
    

Cómo crear una plantilla de instancias de HAProxy basada en la imagen personalizada

Utiliza la opción --no-address para evitar la asignación de una dirección IP externa.

 me@local:~$ gcloud compute instance-templates create haproxy-template \
 --image haproxy-base-image --no-address

Cómo crear un grupo de instancias administrado llamado haproxy

La opción --base-instance-name te permite establecer el prefijo para el nombre de la instancia que el administrador de grupos de instancias asigna a la instancia que crea. Para este ejemplo, usa haproxy-server como prefijo. El nombre de la instancia será haproxy-server-xxxx, en el que xxxx es una serie de letras o números.

me@local:~$ gcloud compute instance-groups managed create haproxy \
--base-instance-name haproxy-server --size 1 --template haproxy-template

Cómo obtener el nombre del servidor HAProxy y probar el balanceador de cargas

Después de crear el grupo de instancias administrado, el administrador de grupos de instancias crea la instancia por ti. Usaremos el comando gcloud compute instances para encontrar el nombre de la nueva instancia.

  1. Anota el nombre de la instancia de HAProxy y luego SSH en la instancia de test-instance.

    me@local:~$ gcloud compute instances list --filter 'name ~ haproxy-server-\w{4}' --format='get(name)'
    me@local:~$ gcloud compute ssh test-instance
    
  2. Utiliza curl para probar el servidor proxy. Reemplaza haproxy-server-xxxx por el nombre del servidor proxy. Cuando repites este comando, el resultado debe mostrar los valores de cada uno de los tres servidores web.

    me@test-instance:~$ curl haproxy-server-xxxx
    
  3. Sal del shell de prueba de instancia.

    me@test-instance:~$ exit
    

Cómo probar la resiliencia del balanceador de cargas

Podemos presentar dos situaciones de falla para probar la resiliencia del balanceador de cargas. Primero, podemos detener la instancia de Compute Engine de HAProxy para probar si el administrador de grupos de instancias vuelve a crear la instancia y si la secuencia de comandos de inicio reinicia correctamente el servicio HAProxy. Segundo, podemos ingresar al servidor HAProxy y detener manualmente el servicio HAProxy para comprobar si systemd detecta la falla y reinicia el servicio.

Cómo probar la instancia de HAProxy

Sigue estos pasos para probar la resiliencia del grupo de instancias administrado de HAProxy.

  1. Usa el comando gcloud compute instances para detener la instancia de HAProxy. Recuerda reemplazar haproxy-server-xxxx por el nombre de tu servidor proxy.

    me@local:~$ gcloud compute instances stop haproxy-server-xxxx
    
  2. Espera unos minutos y luego verifica si la instancia se está ejecutando. El administrador de grupos de instancias debe volver a crear la instancia.

    me@local:~$ gcloud compute instances list
    
  3. Una vez que la instancia se está ejecutando nuevamente, puedes ingresar a la instancia de prueba para verificar que el balanceador de cargas esté funcionando. Sal de la instancia de prueba cuando hayas terminado la prueba.

Cómo probar el servicio HAProxy

La prueba del servicio HAProxy requiere algunos pasos adicionales, porque no puede conectarse directamente a la instancia de HAProxy desde tu máquina de desarrollo. Sin embargo, puedes conectarte a test-instance y luego usar el ssh de instancia a instancia para acceder a la instancia de haproxy-server-xxxx.

  1. Configura el ssh de instancia a instancia.

    me@local:~$ eval `ssh-agent`
    me@local:~$ ssh-add ~/.ssh/google\_compute\_engine
    
  2. Conéctate a la instancia de prueba con la opción ssh-flag.

    me@local:~$ gcloud compute ssh test-instance --ssh-flag="-A"
    
  3. Usa ssh en la instancia de prueba para conectarte a la instancia de haproxy-server-xxxx (reemplaza haproxy-server-xxxx por el nombre de tu instancia de haproxy-server).

    me@test-instance:~$ ssh haproxy-server-xxxx
    
  4. Comprueba el estado del servidor haproxy. El resultado del comando debe incluir la palabra running, una marca de tiempo del inicio del servicio más reciente y hace cuánto tiempo se realizó.

    me@haproxy-server-xxxx:~$ sudo service haproxy status | grep Active
    
  5. Detén el proceso del servidor HAProxy para probar si el servicio HAProxy se reinicia.

    me@haproxy-server-xxxx:~$ sudo pkill haproxy
    
  6. Comprueba el estado nuevamente para ver si el servicio HAProxy se reinició. El resultado debería informar nuevamente que el servicio está en ejecución (running), pero la marca de tiempo del último inicio del servicio debería ser más reciente.

    me@haproxy-server-xxxx:~$ sudo service haproxy status | grep Active
    
  7. Sal de shell en ambas instancias.

    me@haproxy-server-xxxx:~$ exit
    me@test-instance:~$ exit
    

Limpieza

Una vez que hayas terminado el instructivo de HAProxy, limpia los recursos creados en Google Cloud Platform para que no se te realicen cargos por ellos en el futuro. Las siguientes secciones describen cómo borrar o desactivar estos recursos.

Cómo borrar el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. In the GCP Console, go to the Projects page.

    Go to the Projects page

  2. In the project list, select the project you want to delete and click Delete delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borra instancias

Para borrar una instancia de Compute Engine, haz lo siguiente:

  1. In the GCP Console, go to the VM Instances page.

    Go to the VM Instances page

  2. Click the checkbox next to your test-instance instance.
  3. Click Delete delete at the top of the page to delete the instance.

Cómo borrar discos

Para borrar un disco de Compute Engine, realiza los siguientes pasos:

  1. En GCP Console, ve a la página Discos.

    Ir a la página Discos

  2. Marca la casilla de verificación junto al disco que quieres borrar.
  3. Haz clic en el botón Borrar en la parte superior de la página para borrar el disco.

Próximos pasos

Ya viste cómo crear una solución de balanceo de cargas interna con HAProxy en una instancia de Compute Engine que se ejecuta en una red privada. También viste cómo hacer que el balanceador de cargas sea más resistente con la API de Instance Group Manager y systemd para supervisar y reparar el estado del balanceador de cargas.

Puedes ampliar o modificar esta solución para admitir diferentes aplicaciones de backend, como servidores de bases de datos o almacenamiento de clave-valor. También puedes hacer que el grupo de servidores de backend sea escalable con la función de escalador automático de Compute Engine.

Para obtener información sobre cómo probar la carga de tu balanceador de cargas interno, consulta Pruebas de carga distribuida con Kubernetes.

Lee acerca de otras soluciones de balanceo de cargas disponibles en Google Cloud Platform:

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…