Configura el balanceo de cargas de TCP/UDP interno con NEG zonales

En esta guía, se muestra cómo implementar un balanceador de cargas de TCP/UDP interno con backends de grupos de extremos de red (NEG) zonales. Los NEG zonales son recursos zonales que representan conjuntos de direcciones IP o combinaciones de direcciones IP y puertos para recursos de Google Cloud dentro de una subred única. Los NEG te permiten crear grupos lógicos de direcciones IP o combinaciones de dirección IP y puerto que representan servicios de software, en lugar de VM completas.

Antes de seguir con esta guía, familiarízate con lo siguiente:

El balanceo de cargas de TCP/UDP interno solo es compatible con los NEG zonales con extremos GCE_VM_IP.

Permisos

Para seguir esta guía, debes crear instancias y modificar una red en un proyecto. Debes ser propietario o editor de un proyecto o tener todas las funciones de IAM de Compute Engine que se detallan a continuación:

Tarea Función requerida
Crear redes, subredes y componentes del balanceador de cargas Administrador de redes
Agregar y quitar reglas de firewall Administrador de seguridad
Crea instancias Administrador de instancias de Compute

Si deseas obtener más información, consulta las siguientes guías:

Descripción general de la configuración

En esta guía, se muestra cómo configurar y probar un balanceador de cargas de TCP/UDP interno con backends de NEG zonales GCE_VM_IP. En los pasos de esta sección, se describe cómo configurar los siguientes elementos:

  1. Una red de VPC de muestra llamada lb-network con una subred personalizada
  2. Reglas de firewall que permiten conexiones entrantes a VM de backend
  3. Cuatro VM:
    • VM vm-a1 y vm-a2 en la zona us-west1-a
    • VM vm-c1 y vm-c2 en la zona us-west1-c
  4. Dos NEG por zonas de backend, neg-a en la zona us-west1-a y neg-c en la zona us-west1-c. Cada NEG tendrá los siguientes extremos:
    • neg-a contiene estos dos extremos:
      • Dirección IP interna de la VM vm-a1
      • Dirección IP interna de la VM vm-a2
    • neg-c contiene estos dos extremos:
      • Dirección IP interna de la VM vm-c1
      • Dirección IP interna de la VM vm-c2
  5. Una VM de cliente (vm-client) en us-west1-a para probar conexiones
  6. Los siguientes componentes del balanceador de cargas de TCP/UDP interno:
    • Un servicio de backend interno en la región us-west1 para administrar la distribución de conexiones a los dos NEG zonales
    • Una regla de reenvío interno y una dirección IP interna para el frontend del balanceador de cargas

Así se ve la arquitectura de este ejemplo:

Configuración del balanceo de cargas de TCP/UDP interno con NEG zonales
Configuración del balanceo de cargas TCP/UDP interno con NEG zonales

Configura una red, una región y una subred

El ejemplo del balanceador de cargas de TCP/UDP interno descrito en esta página se crea en una red de VPC de modo personalizado llamada lb-network.

Las VM de backend de este ejemplo, los NEG zonales y los componentes del balanceador de cargas se encuentran en la región y la subred que se incluyen a continuación:

  • Región: us-west1
  • Subred: lb-subnet, con el rango de direcciones IP principales 10.1.2.0/24

Para crear la red y la subred de ejemplo, sigue estos pasos:

Console

  1. Ve a la página Redes de VPC en Google Cloud Console.
    Ir a la página Redes de VPC
  2. Haz clic en Crear red de VPC
  3. En Nombre ingresa lb-network.
  4. En la sección Subredes, haz lo siguiente:
    • Establece Modo de creación de subred en Personalizado.
    • En la sección Nueva subred, ingresa la siguiente información:
      • Nombre: lb-subnet
      • Región:: us-west1
      • Rangos de direcciones IP: 10.1.2.0/24
      • Haz clic en Listo.
  5. Haz clic en Crear.

gcloud

  1. Crea la red de VPC personalizada:

    gcloud compute networks create lb-network --subnet-mode=custom
    
    1. Dentro de la red lb-network, crea una subred para las VM de backend en la región us-west1:
    gcloud compute networks subnets create lb-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

Configura las reglas de firewall

En este ejemplo, se usan las siguientes reglas de firewall:

  • fw-allow-lb-access: Es una regla de entrada, aplicable a todos los destinos en la red de VPC, que permite el tráfico de fuentes en el rango 10.1.2.0/24. Esta regla permite el tráfico entrante desde cualquier cliente ubicado en lb-subnet.

  • fw-allow-ssh: Una regla de entrada aplicable a las instancias con balanceo de cargas y que permite la conectividad SSH entrante en el puerto TCP 22 desde cualquier dirección. Puedes elegir un rango de IP de origen más restrictivo para esta regla; por ejemplo, puedes especificar solo los rangos de IP del sistema desde el cual iniciarás sesiones SSH. En este ejemplo se usa la etiqueta de destino allow-ssh para identificar las VM a las que se debe aplicar.

Sin estas reglas de firewall, la regla de entrada predeterminada denegada bloquea el tráfico entrante a las instancias de backend.

Console

  1. Ve a la página Firewall en Google Cloud Console.
    Ir a la página Firewall
  2. Haz clic en Crear regla de firewall e ingresa la siguiente información para crear la regla que permitirá el tráfico de subred:
    • Nombre: fw-allow-lb-access
    • Red: lb-network
    • Prioridad: 1000
    • Dirección del tráfico: entrada
    • Acción si hay coincidencia: permitir
    • Objetivos: todas las instancias de la red
    • Filtro de fuente: IP ranges
    • Rangos de IP de origen10.1.2.0/24
    • Protocolos y puertos: permitir todos
  3. Haz clic en Crear.
  4. Vuelve a hacer clic en Crear regla de firewall para crear la regla que permitirá conexiones SSH entrantes:
    • Nombre: fw-allow-ssh
    • Red: lb-network
    • Prioridad: 1000
    • Dirección del tráfico: entrada
    • Acción si hay coincidencia: permitir
    • Objetivos: etiquetas de destino especificadas
    • Etiquetas de destino: allow-ssh
    • Filtro de fuente: IP ranges
    • Rangos de IP de origen0.0.0.0/0
    • Protocolos y puertos: elige Protocolos y puertos especificados y escribe tcp:22
  5. Haz clic en Crear.
  6. Haz clic en Crear regla de firewall por tercera vez para crear la regla que permitirá las verificaciones de estado de Google Cloud:
    • Nombre: fw-allow-health-check
    • Red: lb-network
    • Prioridad: 1000
    • Dirección del tráfico: entrada
    • Acción si hay coincidencia: permitir
    • Objetivos: etiquetas de destino especificadas
    • Etiquetas de destino: allow-health-check
    • Filtro de fuente: IP ranges
    • Rangos de IP de origen: 130.211.0.0/22 y 35.191.0.0/16
    • Protocolos y puertos: permitir todos
  7. Haz clic en Crear.

gcloud

  1. Crea la regla de firewall fw-allow-lb-access para permitir la comunicación desde la subred:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24 \
        --rules=tcp,udp,icmp
    
  2. Crea la regla de firewall fw-allow-ssh para permitir la conectividad SSH a las VM con la etiqueta de red allow-ssh. Cuando omites source-ranges, Google Cloud interpreta que la regla significa cualquier fuente.

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. Crea la regla fw-allow-health-check para permitir las verificaciones de estado de Google Cloud.

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp,udp,icmp
    

Crea VM y grupos de extremos de red

Para demostrar la naturaleza regional del balanceo de cargas de TCP/UDP interno, en este ejemplo, se usan dos backends de NEG zonales, neg-a y neg-c, en las zonas us-west1-a y us- west1-c. El tráfico se balancea entre los NEG y los extremos dentro de cada NEG.

Crea VM

Para admitir este ejemplo, cada una de las cuatro VM ejecuta un servidor web Apache que escucha en los siguientes puertos TCP: 80, 8008, 8080, 8088, 443 y 8443.

A cada VM se le asigna una dirección IP interna en la lb-subnet y una dirección IP externa (pública) y efímera. Puedes quitar las direcciones IP externas más adelante.

No se necesitan direcciones IP externas para las VM de backend. Sin embargo, son útiles en este ejemplo porque permiten que las VM descarguen Apache de Internet y facilitan la conexión a través de SSH. De forma predeterminada, Apache está configurado para vincularse a cualquier dirección IP. Los balanceadores de cargas de TCP/UDP internos entregan paquetes mediante la preservación de la IP de destino.

Asegúrate de que el software del servidor que se ejecuta en las VM escuche en la dirección IP de la regla de reenvío interno del balanceador de cargas.

Para simplificar el instructivo, estas VM de backend ejecutan Debian GNU/Linux 10.

Console

Crea VM

  1. Ve a la página Instancias de VM en Google Cloud Console.
    Ir a la página Instancias de VM
  2. Repite los siguientes pasos para crear cuatro VM con las siguientes combinaciones de nombre y zona:
    • Nombre: vm-a1, zona: us-west1-a
    • Nombre: vm-a2, zona: us-west1-a
    • Nombre: vm-c1, zona: us-west1-c
    • Nombre: vm-c2, zona: us-west1-c
  3. Haz clic en Crear instancia.
  4. En Nombre establece lo que se indica en el paso 2.
  5. En Región elige us-west1 y selecciona una opción de Zona, como se indica en el paso 2.
  6. En la sección Disco de arranque, asegúrate de que el sistema operativo Debian y la versión 10 (buster) estén seleccionados como opciones de disco de arranque. Haz clic en Elegir para cambiar la imagen si es necesario.
  7. Haz clic en Administración, seguridad, discos, herramientas de redes, usuario único y realiza los siguientes cambios:

    • Haz clic en Herramientas de redes y agrega las siguientes Etiquetas de red: allow-ssh y allow-health-check.
    • Haz clic en Editar  en Interfaces de red y realiza los siguientes cambios. Luego, haz clic en Listo:
      • Red: lb-network
      • Subred: lb-subnet
      • IP interna principal: efímera (automática)
      • IP externa: efímera
    • Haz clic en Administración. En el campo Secuencia de comandos de inicio, copia y pega el siguiente contenido de la secuencia de comandos. El contenido de secuencia de comandos es idéntico para las cuatro VM:

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      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
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  8. Haz clic en Crear.

gcloud

A fin de crear cuatro VM, ejecuta el siguiente comando cuatro veces, con estas cuatro combinaciones para [VM-NAME] y [ZONE]. El contenido de la secuencia de comandos es idéntico para las cuatro VM.

  • [VM-NAME] de vm-a1 y [ZONE] de us-west1-a
  • [VM-NAME] de vm-a2 y [ZONE] de us-west1-a
  • [VM-NAME] de vm-c1 y [ZONE] de us-west1-c
  • [VM-NAME] de vm-c2 y [ZONE] de us-west1-c

    gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

Crea NEG zonales GCE_VM_IP

Los NEG (neg-a y neg-c) deben crearse en las mismas zonas que las VM creadas en el paso anterior.

Console

No puedes usar Cloud Console para crear o administrarGCE_VM_IP NEG zonales. En su lugar, usa gcloud o la API de REST.

gcloud

  1. Crea un NEG zonal GCE_VM_IP llamado neg-a en us-west1-a mediante el comando gcloud compute network-endpoint-groups create:

    gcloud compute network-endpoint-groups create neg-a \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet
    
  2. Agrega extremos a neg-a:

    gcloud compute network-endpoint-groups update neg-a \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-a1' \
        --add-endpoint='instance=vm-a2'
    
  3. Crea un NEG zonal GCE_VM_IP llamado neg-c en us-west1-c mediante el comando gcloud compute network-endpoint-groups create:

    gcloud compute network-endpoint-groups create neg-c \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-c \
        --network=lb-network \
        --subnet=lb-subnet
    
  4. Agrega extremos a neg-c:

    gcloud compute network-endpoint-groups update neg-c \
        --zone=us-west1-c \
        --add-endpoint='instance=vm-c1' \
        --add-endpoint='instance=vm-c2'
    

Crea una VM cliente

En este ejemplo se crea una VM de cliente (vm-client) en la misma región en la que están las VM de backend (servidor). El cliente se usa para validar la configuración del balanceador de cargas y demostrar el comportamiento esperado, como se describe en la sección de pruebas.

Console

  1. Ve a la página Instancias de VM en Google Cloud Console.
    Ir a la página Instancias de VM
  2. Haz clic en Crear instancia.
  3. Configura el campo Nombre como vm-client.
  4. En Zona establece us-west1-a.
  5. Haz clic en Administración, seguridad, discos, herramientas de redes, usuario único y realiza los siguientes cambios:
    • Haz clic en Herramientas de redes y agrega allow-ssh a Etiquetas de red.
    • Haz clic en el botón Editar, en Interfaces de red, y realiza los siguientes cambios. Luego, haz clic en Listo:
      • Red: lb-network
      • Subred: lb-subnet
      • IP interna principal: efímera (automática)
      • IP externa: Efímera
  6. Haz clic en Crear.

gcloud

La VM de cliente puede estar en cualquier zona de la misma región que el balanceador de cargas y puede usar cualquier subred en esa región. En este ejemplo el cliente se encuentra en la zona us-west1-a y usa la misma subred que las VM de backend.

gcloud compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=lb-subnet

Configura componentes del balanceador de cargas

Con estos pasos, se configuran todos los componentes del balanceador de cargas de TCP/UDP interno:

  • Servicio de backend: para este ejemplo, debes pasar el tráfico HTTP a través del balanceador de cargas. Por lo tanto, debes usar TCP, no UDP.

  • Regla de reenvío: en este ejemplo se crea una sola regla de reenvío interno.

  • Dirección IP interna: en este ejemplo, se especifica una dirección IP interna, 10.1.2.99, cuando creas la regla de reenvío.

Console

gcloud

  1. Crea una nueva verificación de estado HTTP regional.

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. Crea el servicio de backend:

    gcloud compute backend-services create bs-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. Agrega los dos NEG zonales, neg-a y neg-c, al servicio de backend:

    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-a \
        --network-endpoint-group-zone=us-west1-a
    
    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-c \
        --network-endpoint-group-zone=us-west1-c
    
  4. Crea una regla de reenvío para el servicio de backend. Cuando crees la regla de reenvío, especifica 10.1.2.99 como la dirección IP interna en la subred.

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=bs-ilb \
        --backend-service-region=us-west1
    

Prueba

En esta prueba, se contacta al balanceador de cargas desde una VM de cliente diferente, es decir, no desde una VM de backend del balanceador de cargas. El comportamiento esperado consiste en que el tráfico se distribuya entre las cuatro VM de backend porque no se configuró ninguna afinidad de sesión.

  1. Conéctate a la instancia de VM de cliente.

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. Realiza una solicitud web al balanceador de cargas mediante curl para establecer contacto con su dirección IP. Repite la solicitud para que puedas ver que las respuestas provienen de diferentes VM de backend. El nombre de la VM que genera la respuesta se muestra en el texto de la respuesta HTML, en virtud del contenido de /var/www/html/index.html en cada VM de backend. Las respuestas esperadas se ven de la siguiente manera: Page served from: vm-a1, Page served from: vm-a2, etcétera.

    curl http://10.1.2.99
    

    La regla de reenvío está configurada para entregar en los puertos 80800880808088. Para enviar tráfico a esos otros puertos, agrega dos puntos (:) y el número de puerto después de la dirección IP, de esta manera:

    curl http://10.1.2.99:8008
    

¿Qué sigue?