Configura el balanceo de cargas de red para varios protocolos IP

En esta guía, se proporcionan instrucciones para crear balanceadores de cargas de red basados en servicios de backend que balancean cargas del tráfico de TCP, UDP, ICMP y ESP. Puedes usar esta configuración si deseas balancear las cargas del tráfico que usa protocolos IP distintos de TCP o UDP. Los balanceadores de cargas de red basados en grupos de destino no admiten esta capacidad.

Si deseas configurar un balanceador de cargas de red para protocolos IP que no sean TCP o UDP, debes crear una regla de reenvío con el protocolo configurado como L3_DEFAULT. Esta regla de reenvío apunta a un servicio de backend con el protocolo configurado como UNSPECIFIED.

En este ejemplo, usamos dos balanceadores de cargas de red para distribuir el tráfico entre las VM de backend en dos grupos de instancias zonales administrados en la región us-central1. Ambos balanceadores de cargas reciben tráfico en la misma dirección IP externa.

Un balanceador de cargas tiene una regla de reenvío con el protocolo TCP y el puerto 80, y el otro balanceador de cargas tiene una regla de reenvío con el protocolo L3_DEFAULT. El tráfico de TCP que llega a la dirección IP en el puerto 80 se controlará con la regla de reenvío de TCP. El resto del tráfico de TCP, UDP, ICMP y ESP que no coincida con la regla de reenvío específica de TCP se controlará mediante la regla de reenvío L3_DEFAULT

Balanceador de cargas de red con grupos de instancias zonales
Balanceo de cargas de red con grupos de instancias zonales administrados

Esta situación distribuye el tráfico en instancias en buen estado. Para ello, debes crear verificaciones de estado de TCP a fin de garantizar que el tráfico se envíe solo a instancias en buen estado.

El balanceador de cargas de red es un balanceador de cargas regional. Todos los componentes del balanceador de cargas deben estar en la misma región.

Antes de comenzar

Instala la herramienta de línea de comandos de gcloud. Para obtener una descripción general completa de la herramienta, consulta la guía de la herramienta de gcloud. Encontrarás comandos relacionados con el balanceo de cargas en la guía de referencia de API y gcloud.

Si no ejecutaste la herramienta de línea de comandos de gcloud antes, primero ejecuta gcloud init para autenticarte.

En esta guía, suponemos que estás familiarizado con Bash.

Crea grupos de instancias zonales administrados

Para esta situación de balanceo de cargas, crearás dos grupos de instancias zonales administrados de Compute Engine y, luego, instalarás un servidor Echo en cada instancia.

Las instancias que participan como VM de backend para balanceadores de cargas de red se deben ejecutar en el entorno invitado de Linux, el entorno invitado de Windows o algún otro proceso que proporcione una funcionalidad equivalente.

Configura el grupo de instancias para el tráfico de TCP en el puerto 80

Cloud Console

  1. Ve a la página Grupos de instancias en Cloud Console.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear grupo de instancias.
  3. Selecciona Nuevo grupo de instancias administrado a la izquierda.
  4. En Nombre, ingresa ig-us-tcp-80.
  5. En Ubicación, selecciona Zona única.
  6. En Región, selecciona us-central1.
  7. En Zona, selecciona us-central1-a.
  8. En Plantilla de instancias, selecciona Crear una nueva plantilla de instancias.

    1. En Nombre, ingresa ig-us-template-tcp-80.
    2. Asegúrate de que el disco de arranque esté configurado en una imagen de Debian, como Debian GNU/Linux 9 (stretch). En estas instrucciones, se usan comandos que solo están disponibles en Debian, como apt-get.
    3. En Administración, seguridad, discos, redes, usuario único, en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    4. En Herramientas de redes, propaga el campo Etiquetas con la etiqueta network-lb-tcp-80.

    5. Haga clic en Guardar y continuar.

  9. Especifica la cantidad de instancias que quieres crear en el grupo.

    En este ejemplo, en Modo de ajuste de escala automático, selecciona lo siguiente:

    • Sin ajuste de escala automático
    • En Cantidad de instancias, ingresa 2.
  10. Haz clic en Crear para crear el grupo de instancias nuevo.

gcloud

En las instrucciones de gcloud que se incluyen en esta guía, se supone que usas Cloud Shell o algún otro entorno con bash instalado.

  1. Crea una plantilla de instancias de VM con el servidor de HTTP con el comando gcloud compute instance-templates create.

    gcloud compute instance-templates create ig-us-template-tcp-80 \
    --region=us-central1 \
    --tags=network-lb-tcp-80 \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'
    
  2. Crea un grupo de instancias administrado en la zona con el comando gcloud compute instance-groups managed create.

    gcloud compute instance-groups managed create ig-us-tcp-80 \
        --zone us-central1-a \
        --size 2 \
        --template ig-us-template-tcp-80
    

Configura el grupo de instancias para el tráfico de TCP en el puerto 8080, UDP, ICMP y ESP

Cloud Console

  1. Ve a la página Grupos de instancias en Cloud Console.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear grupo de instancias.
  3. Selecciona Nuevo grupo de instancias administrado a la izquierda.
  4. En Nombre, ingresa ig-us-l3-default.
  5. En Ubicación, selecciona Zona única.
  6. En Región, selecciona us-central1.
  7. En Zona, seleccione us-central1-c.
  8. En Plantilla de instancias, selecciona Crear una nueva plantilla de instancias.

    1. En Nombre, ingresa ig-us-template-l3-default.
    2. Asegúrate de que el disco de arranque esté configurado en una imagen de Debian, como Debian GNU/Linux 9 (stretch). En estas instrucciones, se usan comandos que solo están disponibles en Debian, como apt-get.
    3. En Administración, seguridad, discos, redes, usuario único, en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio. La secuencia de comandos de inicio también configura el servidor Apache para que escuche en el puerto 8080 en lugar de en el puerto 80.

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sed -ire 's/^Listen 80$/Listen 8080/g' /etc/apache2/ports.conf
      systemctl restart apache2
      
    4. En Herramientas de redes, propaga el campo Etiquetas con la etiqueta network-lb-l3-default.

    5. Haga clic en Guardar y continuar.

  9. Especifica la cantidad de instancias que quieres crear en el grupo.

    En este ejemplo, en Modo de ajuste de escala automático, selecciona lo siguiente:

    • Sin ajuste de escala automático
    • En Cantidad de instancias, ingresa 2.
  10. Haz clic en Crear para crear el grupo de instancias nuevo.

gcloud

En las instrucciones de gcloud que se incluyen en esta guía, se supone que usas Cloud Shell o algún otro entorno con bash instalado.

  1. Crea una plantilla de instancias de VM con el servidor de HTTP con el comando gcloud compute instance-templates create.

    La secuencia de comandos de inicio también configura el servidor Apache para que escuche en el puerto 8080 en lugar de en el puerto 80.

    gcloud compute instance-templates create ig-us-template-l3-default \
    --region=us-central1 \
    --tags=network-lb-l3-default \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    systemctl restart apache2'
    
  2. Crea un grupo de instancias administrado en la zona con el comando gcloud compute instance-groups managed create.

    gcloud compute instance-groups managed create ig-us-l3-default \
        --zone us-central1-c \
        --size 2 \
        --template ig-us-template-l3-default
    

Configura las reglas de firewall

Crea las siguientes reglas de firewall:

  • Una regla de firewall que permite que el tráfico de TCP externo llegue a instancias de backend en el grupo de instancias ig-us-tcp-80 del puerto 80 (mediante la etiqueta de destino network-lb-tcp-80).
  • Una regla de firewall que permite que otro tráfico externo (TCP en el puerto 8080, UDP, ICMP y ESP) llegue a instancias de backend en el grupo de instancias ig-us-l3-default (mediante la etiqueta de destino network-lb-l3-default).

Console

  1. Ve a la página Firewalls en Google Cloud Console.
    Ir a la página Firewalls
  2. Crea la primera regla de firewall para el tráfico de TCP.
    1. Haz clic en Crear regla de firewall.
    2. Ingresa un Nombre de allow-network-lb-tcp-80.
    3. Selecciona la Red a la que se aplicará la regla de firewall (Predeterminada).
    4. En Destinos, selecciona Etiquetas de destino especificadas.
    5. En el campo Etiquetas de destino, ingresa network-lb-tcp-80.
    6. Establece los Rangos de IP de origen en 0.0.0.0/0, lo que permite el tráfico desde cualquier fuente. Esto permite que el tráfico externo y los sondeos de verificaciones de estado lleguen a las instancias de backend.
    7. En Protocolos y puertos, selecciona Protocolos y puertos especificados. Haz clic en la casilla de verificación junto a tcp y, luego, ingresa 80.
    8. Haga clic en Crear. Pueden pasar unos minutos hasta que Console muestre la regla de firewall nueva, o es posible que debas hacer clic en Actualizar a fin de ver la regla.
  3. Crea la segunda regla de firewall para el tráfico de UDP, ICMP y ESP.
    1. Haz clic en Crear regla de firewall.
    2. Ingresa un Nombre de allow-network-lb-l3-default.
    3. Selecciona la Red a la que se aplicará la regla de firewall (Predeterminada).
    4. En Destinos, selecciona Etiquetas de destino especificadas.
    5. En el campo Etiquetas de destino, ingresa network-lb-l3-default.
    6. Establece los Rangos de IP de origen en 0.0.0.0/0, lo que permite el tráfico desde cualquier fuente. Esto permite que el tráfico externo y los sondeos de verificaciones de estado lleguen a las instancias de backend.
    7. En Protocolos y puertos, selecciona Protocolos y puertos especificados.
      1. Haz clic en la casilla de verificación junto a tcp y, luego, ingresa 8080.
      2. Haz clic en la casilla de verificación junto a udp.
      3. Haz clic en la casilla de verificación junto a Otros protocolos y, luego, ingresa esp, icmp.
    8. Haga clic en Crear. Pueden pasar unos minutos hasta que Console muestre la regla de firewall nueva, o es posible que debas hacer clic en Actualizar a fin de ver la regla.

gcloud

  1. Crea la primera regla de firewall para el tráfico de TCP.

    gcloud compute firewall-rules create allow-network-lb-tcp-80 \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80
    
  2. Crea la segunda regla de firewall para el tráfico de UDP, ICMP y ESP. Este firewall también permite que los sondeos de verificación de estado de TCP lleguen a las instancias del puerto 8080.

    gcloud compute firewall-rules create allow-network-lb-l3-default \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,icmp
    

Configura los balanceadores de cargas

A continuación, configura los balanceadores de cargas. Un balanceador de cargas para controlar el tráfico de TCP en el puerto 80 y otro para manejar el tráfico de TCP en el puerto 8080, UDP, ICMP y ESP. Ambos balanceadores de cargas usarán la misma dirección IP externa con sus reglas de reenvío.

Cuando configuras un balanceador de cargas, tus instancias de VM de backend recibirán paquetes destinados a la dirección IP externa estática que configures. Si usas una imagen proporcionada por Compute Engine, tus instancias se configurarán de forma automática para controlar esta dirección IP. Si usas cualquier otra imagen, debes configurar esta dirección como un alias en eth0 o como un bucle invertido en cada instancia.

gcloud

  1. Cree una dirección IP externa estática para su balanceador de cargas:

    gcloud compute addresses create network-lb-ip \
        --region us-central1
    
  2. Crea una verificación de estado de TCP para el puerto 80. Esto se usa para verificar el estado de los backends en el grupo de instancias ig-us-tcp-80.

    gcloud compute health-checks create tcp tcp-health-check-80 \
        --region us-central1 \
        --port 80
    
  3. Crea una verificación de estado de TCP para el puerto 8080. Esto se usa para verificar el estado de los backends en el grupo de instancias ig-us-l3-default.

    gcloud compute health-checks create tcp tcp-health-check-8080 \
        --region us-central1 \
        --port 8080
    
  4. Crea el primer balanceador de cargas para el tráfico de TCP en el puerto 80.

    1. Crea un servicio de backend con el protocolo TCP.

      gcloud beta compute backend-services create backend-service-tcp-80 \
          --protocol TCP \
          --health-checks tcp-health-check-80 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. Agrega el grupo de instancias principal al servicio de backend:

      gcloud beta compute backend-services add-backend backend-service-tcp-80 \
          --instance-group ig-us-tcp-80 \
          --instance-group-zone us-central1-a \
          --region us-central1
      
    3. Crea una regla de reenvío para enrutar el tráfico de TCP entrante en el puerto 80 al servicio de backend. TCP es el protocolo de reglas de reenvío predeterminado y no es necesario configurarlo de forma explícita.

      Usa la dirección IP reservada en el paso 1 como la dirección IP externa estática del balanceador de cargas.

      gcloud beta compute forwarding-rules create forwarding-rule-tcp-80 \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports 80 \
          --address network-lb-ip \
          --backend-service backend-service-tcp-80
      
  5. Crea el segundo balanceador de cargas para el tráfico de TCP en el puerto 8080, UDP, ICMP y ESP.

    1. Crea un servicio de backend con el protocolo UNSPECIFIED.

      gcloud beta compute backend-services create backend-service-l3-default \
          --protocol UNSPECIFIED \
          --health-checks tcp-health-check-8080 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. Agrega el grupo de instancias principal al servicio de backend:

      gcloud beta compute backend-services add-backend backend-service-l3-default \
          --instance-group ig-us-l3-default \
          --instance-group-zone us-central1-c \
          --region us-central1
      
    3. Crea una regla de reenvío con el protocolo configurado en L3_DEFAULT para controlar todo el tráfico de protocolo IP admitido restante (TCP en el puerto 8080, UDP, ICMP y ESP). Todos los puertos deben configurarse con reglas de reenvío L3_DEFAULT.

      Usa la misma dirección IP externa que usaste para el balanceador de cargas anterior.

      gcloud beta compute forwarding-rules create forwarding-rule-l3-default \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --address network-lb-ip \
          --backend-service backend-service-l3-default
      

Prueba el balanceador de cargas

Ahora que el servicio de balanceo de cargas está configurado, puedes comenzar a enviar tráfico a la dirección IP externa del balanceador de cargas y ver cómo se distribuye el tráfico a las instancias de backend.

Busca la dirección IP externa del balanceador de cargas

Console

  1. En la página de balanceo de cargas Avanzado, ve a la pestaña Reglas de reenvío.
    Ir a la pestaña Reglas de reenvío
  2. Ubica forwarding-rule-tcp-80 o forwarding-rule-l3-default. En este ejemplo, se usa la misma dirección IP para ambos balanceadores de cargas, por lo que cualquiera de ellos funcionará.
  3. En la columna Dirección IP de , anota la dirección IP externa que aparece en la lista.

gcloud

Ingresa el siguiente comando para ver la dirección IP externa de la regla de reenvío que usa el balanceador de cargas.

gcloud beta compute forwarding-rules describe forwarding-rule-tcp-80 \
    --region us-central1

En este ejemplo, se usa la misma dirección IP para ambas reglas de reenvío, por lo que el uso de forwarding-rule-l3-default también funcionará.

Envía tráfico al balanceador de cargas

Este procedimiento envía tráfico externo al balanceador de cargas. Ejecuta las siguientes pruebas para asegurarte de que el grupo de instancias ig-us-tcp-80 balancee las cargas del tráfico de TCP en el puerto 80, mientras el grupo de instancias ig-us-l3-default administra todo el resto del tráfico (TCP en el puerto 8080, UDP, ICMP y ESP).

Verifica el comportamiento con las solicitudes de TCP en el puerto 80

  1. Realiza solicitudes web (a través de TCP en el puerto 80) al balanceador de cargas mediante curl para contactar a su dirección IP.

    $ while true; do curl -m1 IP_ADDRESS; done
    
  2. Ten en cuenta el texto que muestra el comando curl. El nombre de la VM de backend que genera la respuesta se muestra en ese texto; por ejemplo: Page served from: VM_NAME. Las respuestas deben provenir solo de instancias del grupo de instancias ig-us-tcp-80.

    Si al principio tu respuesta es incorrecta, es posible que debas esperar alrededor de 30 segundos para que la configuración se cargue por completo y tus instancias se marquen como en buen estado antes de intentar otra vez.

Verifica el comportamiento con las solicitudes de TCP en el puerto 8080

  1. Realiza solicitudes web (a través de TCP en el puerto 8080) al balanceador de cargas mediante curl para contactar su dirección IP.

    $ while true; do curl -m1 IP_ADDRESS:8080; done
    
  2. Ten en cuenta el texto que muestra el comando curl. Las respuestas deben provenir solo de instancias del grupo de instancias ig-us-l3-default.

    Esto muestra que cualquier tráfico enviado a la dirección IP del balanceador de cargas en el puerto 8080 se administra mediante backends en el grupo de instancias ig-us-l3-default.

Verifica el comportamiento con las solicitudes de ICMP

Para verificar el comportamiento con el tráfico ICMP, captura el resultado del comando tcpdump a fin de confirmar que solo las VM de backend en el grupo de instancias ig-us-l3-default manejen las solicitudes ICMP enviadas al balanceador de cargas.

  1. Establece una conexión SSH a las VM de backend.

    1. En Cloud Console, ve a la página Instancias de VM.
      Ir a la página Instancias de VM

    2. En la lista de instancias de máquinas virtuales, haz clic en SSH en la fila de la instancia a la que deseas conectarte.

  2. Ejecuta el siguiente comando a fin de usar tcpdump para comenzar a escuchar el tráfico de ICMP.

    sudo tcpdump icmp -w ~/icmpcapture.pcap -s0 -c 10000
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    Deja abierta la ventana SSH.

  3. Repite los pasos 1 y 2 para las cuatro VM de backend.

  4. Realiza solicitudes ICMP al balanceador de cargas mediante ping para contactar a su dirección IP.

    ping IP_ADDRESS
    
  5. Regresa a la ventana SSH abierta de cada VM y detén el comando de captura tcpdump. Para hacerlo, presiona Ctrl + C.

  6. Para cada VM, verifica la salida del comando tcpdump en el archivo icmpcapture.pcap.

    sudo tcpdump -r ~/icmpcapture.pcap -n
    

    Para las VM de backend en el grupo de instancias ig-us-l3-default, deberías ver entradas de archivo como las siguientes:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    22:13:07.814486 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 1, length 64
    22:13:07.814513 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 1, length 64
    22:13:08.816150 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 2, length 64
    22:13:08.816175 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 2, length 64
    22:13:09.817536 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 3, length 64
    22:13:09.817560 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 3, length 64
    ...
    

    Para las VM de backend en el grupo de instancias ig-us-tcp-80, deberías ver que no se recibieron paquetes y el archivo debería estar en blanco:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    

¿Qué sigue?