Configura un balanceador de cargas de red del proxy externo (proxy TCP) con backends de grupos de instancias de VM

El balanceador de cargas de red del proxy clásico de Google Cloud te permite usar una sola dirección IP para todos los usuarios a nivel global. Los balanceadores de cargas de red del proxy clásico enrutan de forma automática el tráfico a instancias de backend que están más cerca del usuario.

En esta página, se brindan instrucciones para configurar un balanceador de cargas de red de proxy clásico con un proxy TCP de destino y backends de grupo de instancias de VM. Antes de comenzar, lee la descripción general del balanceador de cargas de red del proxy externo para obtener información detallada sobre cómo funcionan estos balanceadores de cargas.

Descripción general de la configuración

En este ejemplo, se muestra cómo configurar un balanceador de cargas de red del proxy externo para un servicio que existe en dos regiones: región A y B. En este ejemplo en particular, el servicio consiste en un conjunto de servidores Apache configurados para responder en el puerto 110. Muchos navegadores no admiten el puerto 110, por lo que, en la sección de prueba, se usa curl.

En este ejemplo, debes configurar lo siguiente:

  1. Cuatro instancias distribuidas entre dos regiones
  2. Grupos de instancias
  3. Una verificación de estado para confirmar el funcionamiento de las instancias
  4. Un servicio de backend que supervisa las instancias y les impide superar el uso configurado
  5. El proxy TCP de destino
  6. Una dirección IPv4 externa estática y una regla de reenvío que envía el tráfico del usuario al proxy
  7. Una dirección IPv6 externa estática y una regla de reenvío que envía el tráfico del usuario al proxy
  8. Una regla de firewall que permite que el tráfico del balanceador de cargas y el verificador de estado llegue a las instancias

Una vez configurado el balanceador de cargas, debes probar la configuración.

Permisos

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

Tarea Función requerida
Crear redes, subredes y componentes del balanceador de cargas Administrador de redes
Agrega y quita 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:

Configura backends de grupos de instancias

En esta sección verás cómo crear grupos de instancias básicos, agregarles instancias y, luego, agregar esas instancias a un servicio de backend con una verificación de estado. Por lo general, en un sistema de producción, se usan grupos de instancias administrados basados en plantillas de instancias, pero esta configuración es más rápida para las pruebas iniciales.

Configura las instancias

Para la prueba instala Apache en cuatro instancias, dos en cada grupo de instancias. Por lo general, los balanceadores de cargas de red del proxy externo no se usan para el tráfico HTTP, pero el software de Apache se suele usar para las pruebas.

En este ejemplo, las instancias se crean con la etiqueta tcp-lb. Esta etiqueta se usa más adelante en la regla de firewall.

Console

Crea instancias

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. Haz clic en Crear instancia.

  3. Establece el Nombre en vm-a1.

  4. Establece la Región en REGION_A.

  5. En Zona establece ZONE_A.

  6. Haz clic en Opciones avanzadas.

  7. Haz clic en Herramientas de redes y configura el siguiente campo:

    • En Etiquetas de red, ingresa tcp-lb,allow-health-check-ipv6.
  • Haz clic en Administración. Ingresa la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo tee /var/www/html/index.html
  • Haz clic en Crear.

  • Crea vm-a2 con la misma configuración, pero con la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html

  • Crea vm-b1 con la misma configuración, pero establece Región en REGION_B y Zona, en ZONE_B. Ingresa la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html

  • Crea vm-b2 con la misma configuración, pero establece Región en REGION_B y Zona, en ZONE_B. Ingresa la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html

  • gcloud

    1. Crea vm-a1 en la zona ZONE_A.

      gcloud compute instances create vm-a1 \
         --image-family debian-10 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_A \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    2. Crea vm-a2 en la zona ZONE_A.

      gcloud compute instances create vm-a2 \
         --image-family debian-10 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_A \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    3. Crea vm-b1 en la zona ZONE_B.

      gcloud compute instances create vm-b1 \
         --image-family debian-10 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_B \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    4. Crea vm-b2 en la zona ZONE_B.

      gcloud compute instances create vm-b2 \
         --image-family debian-10 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_B \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      

    Crea grupos de instancias

    En esta sección, crearás un grupo de instancias en cada zona y agregarás las instancias.

    Console

    1. En la consola de Google Cloud, ve a la página Grupos de instancias.

      Ir a Grupos de instancias

    2. Haz clic en Crear grupo de instancias.

    3. Haz clic en Crea un nuevo grupo de instancias no administrado.

    4. Ingresa instance-group-a en Nombre.

    5. En Zona establece ZONE_A.

    6. En Asignación de puertos, haz clic en Agregar puerto. Un balanceador de cargas envía tráfico a un grupo de instancias a través de un puerto con nombre. Crea un puerto con nombre para asignar el tráfico entrante a un número de puerto específico.

      1. Configura el campo Nombre del puerto como tcp110.
      2. Establece Números de puerto en 110.
    7. En Instancias de VM, selecciona vm-a1 y vm-a2.

    8. Deja el resto de la configuración como está.

    9. Haz clic en Crear.

    10. Repite los pasos, pero configura los siguientes valores:

      • Nombre: instance-group-b
      • Región: REGION_B
      • Zona: ZONE_B
      • Nombre del puerto: tcp110
      • Números de puerto: 110
      • Instancias: vm-b1 y vm-b2.

    gcloud

    1. Crea el grupo de instancias instance-group-a.

      gcloud compute instance-groups unmanaged create instance-group-a \
         --zone ZONE_A
      
    2. Crea un puerto con nombre para el grupo de instancias.

      gcloud compute instance-groups set-named-ports instance-group-a \
         --named-ports tcp110:110 \
         --zone ZONE_A
      
    3. Agrega vm-a1 y vm-a2 a instance-group-a.

      gcloud compute instance-groups unmanaged add-instances instance-group-a \
         --instances vm-a1,vm-a2 \
         --zone ZONE_A
      
    4. Crea el grupo de instancias us-ig2.

      gcloud compute instance-groups unmanaged create instance-group-b \
         --zone ZONE_B
      
    5. Crea un puerto con nombre para el grupo de instancias.

      gcloud compute instance-groups set-named-ports instance-group-b \
         --named-ports tcp110:110 \
         --zone ZONE_B
      
    6. Agrega vm-b1 y vm-b2 a instance-group-b.

      gcloud compute instance-groups unmanaged add-instances instance-group-b \
         --instances vm-b1,vm-b2 \
         --zone ZONE_B
      

    Ahora tienes un grupo de instancias por región y cada grupo de instancias tiene dos instancias de VM.

    Crea una regla de firewall para el balanceador de cargas de red del proxy externo

    Configura el firewall para permitir el tráfico del balanceador de cargas y el verificador de estado a las instancias. En este caso, abriremos el puerto TCP 110. La verificación de estado utilizará el mismo puerto. Debido a que el tráfico entre el balanceador de cargas y tus instancias usa IPv4, solo es necesario abrir los rangos de IPv4.

    Console

    1. En la consola de Google Cloud, ve a la página Políticas de firewall.

      Ir a Políticas de firewall

    2. Haz clic en Crear regla de firewall.

    3. En el campo Nombre, ingresa allow-tcp-lb-and-health.

    4. Elige una red.

    5. En Destinos, selecciona Etiquetas de destino especificadas.

    6. Configura las Etiquetas de destino como tcp-lb.

    7. Configura Filtro de fuente como Rangos de IPv4.

    8. Configura Rangos de IPv4 de origen como 130.211.0.0/22,35.191.0.0/16.

    9. En Protocolos y puertos, establece Protocolos y puertos especificados como tcp:110.

    10. Haz clic en Crear.

    gcloud

    gcloud compute firewall-rules create allow-tcp-lb-and-health \
       --source-ranges 130.211.0.0/22,35.191.0.0/16 \
       --target-tags tcp-lb \
       --allow tcp:110
    

    Configura el balanceador de cargas

    Console

    Inicia la configuración

    1. En la consola de Google Cloud, ve a la página Balanceo de cargas.

      Ir a Balanceo de cargas

    2. Haz clic en Crear balanceador de cargas.
    3. En Tipo de balanceador de cargas, selecciona Balanceador de cargas de red (TCP/UDP/SSL) y haz clic en Siguiente.
    4. En Proxy o transferencia, selecciona Balanceador de cargas de proxy y haz clic en Siguiente.
    5. En Orientado al público o interno, selecciona Orientado al público (externo) y haz clic en Siguiente.
    6. En Implementación global o de una sola región, selecciona Mejor para cargas de trabajo globales y haz clic en Siguiente.
    7. En Generación de balanceadores de cargas, selecciona Balanceador de cargas de red de proxy clásico y haz clic en Siguiente.
    8. Haz clic en Configurar.

    Configuración básica

    Configura el campo Nombre como my-tcp-lb.

    Configuración de backend

    1. Haz clic en Configuración de backend.
    2. En Tipo de backend, selecciona Grupos de instancias.
    3. En Protocolo, selecciona TCP.
    4. Configura el primer backend:
      1. En Nuevo backend, selecciona el grupo de instancias instance-group-a.
      2. Conserva los valores predeterminados restantes.
    5. Configura el segundo backend:
      1. Haz clic en Agregar backend.
      2. Selecciona el grupo de instancias instance-group-b.
      3. En Números de puerto, borra 80 y agrega 110.
    6. Configura la verificación de estado:
      1. En Verificación de estado, selecciona Crear verificación de estado.
      2. Establece el campo Nombre de la verificación de estado en my-tcp-health-check.
      3. En Protocolo, selecciona TCP.
      4. Configura el campo Puerto como 110.
      5. Conserva los valores predeterminados restantes.
      6. Haz clic en Guardar y continuar.
    7. En la consola de Google Cloud, verifica que haya una marca de verificación junto a Configuración de backend. De lo contrario, verifica que hayas completado todos los pasos.

    Configuración de frontend

    1. Haz clic en Configuración de frontend.
    2. Agrega la primera regla de reenvío:
      1. Ingresa un Nombre de my-tcp-lb-forwarding-rule.
      2. En Protocolo, selecciona TCP.
      3. En Dirección IP, selecciona Crear dirección IP:
        1. Ingresa un Nombre de tcp-lb-static-ip.
        2. Haz clic en Reservar.
      4. Configura el Puerto como 110.
      5. En este ejemplo, no habilites el protocolo PROXY porque no funciona con el software del servidor HTTP de Apache. Para obtener más información, consulta Protocolo PROXY.
      6. Haz clic en Listo.
    3. Agrega la segunda regla de reenvío:
      1. Haz clic en Agregar IP y puerto de frontend.
      2. Ingresa my-tcp-lb-ipv6-forwarding-rule en Nombre.
      3. En Protocolo, selecciona TCP.
      4. Establece Versión de IP en IPv6.
      5. En Dirección IP (IP address), haz clic en Crear dirección IP.
        1. Ingresa un nombre de tcp-lb-ipv6-static-ip.
        2. Haz clic en Reservar.
      6. Configura el Puerto como 110.
      7. En este ejemplo, no habilites el protocolo PROXY porque no funciona con el software del servidor HTTP de Apache. Para obtener más información, consulta Protocolo PROXY.
      8. Haz clic en Listo.
    4. En la consola de Google Cloud, verifica que haya una marca de verificación junto a Configuración de frontend. De lo contrario, verifica que hayas completado todos los pasos anteriores.

    Revisa y finaliza

    1. Haz clic en Revisar y finalizar.
    2. Revisa la configuración del balanceador de cargas.
    3. Opcional: Haz clic en Código equivalente a fin de ver la solicitud a la API de REST que se usará para crear el balanceador de cargas.
    4. Haz clic en Crear.

    gcloud

    1. Crea una verificación de estado.
          gcloud compute health-checks create tcp my-tcp-health-check --port 110
          
    2. Crea un servicio de backend.
          gcloud compute backend-services create my-tcp-lb \
              --load-balancing-scheme EXTERNAL \
              --global-health-checks \
              --global \
              --protocol TCP \
              --health-checks my-tcp-health-check \
              --timeout 5m \
              --port-name tcp110
          
    3. Agrega grupos de instancias a tu servicio de backend.
          gcloud compute backend-services add-backend my-tcp-lb \
              --global \
              --instance-group instance-group-a \
              --instance-group-zone ZONE_A \
              --balancing-mode UTILIZATION \
              --max-utilization 0.8
          
          gcloud compute backend-services add-backend my-tcp-lb \
              --global \
              --instance-group instance-group-b \
              --instance-group-zone ZONE_B \
              --balancing-mode UTILIZATION \
              --max-utilization 0.8
          
    4. Configura un proxy TCP de destino Si quieres activar el encabezado de proxy, configúralo como PROXY_V1 en lugar de NONE.
          gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy \
              --backend-service my-tcp-lb \
              --proxy-header NONE
          
    5. Reserva direcciones IPv4 y, también, IPv6 estáticas globales

      Tus clientes pueden usar estas direcciones IP para acceder al servicio de balanceo de cargas.

          gcloud compute addresses create tcp-lb-static-ipv4 \
              --ip-version=IPV4 \
              --global
          
          gcloud compute addresses create tcp-lb-static-ipv6 \
              --ip-version=IPV6 \
              --global
          
    6. Configura reglas de reenvío globales para las dos direcciones
          gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
              --load-balancing-scheme EXTERNAL \
              --global \
              --target-tcp-proxy my-tcp-lb-target-proxy \
              --address tcp-lb-static-ipv4 \
              --ports 110
          
          gcloud compute forwarding-rules create my-tcp-lb-ipv6-forwarding-rule \
              --load-balancing-scheme EXTERNAL \
              --global \
              --target-tcp-proxy my-tcp-lb-target-proxy \
              --address tcp-lb-static-ipv6 \
              --ports 110
          

    Prueba el balanceador de cargas

    1. Obtén la dirección IP del balanceador de cargas.

      Para obtener la dirección IPv4, ejecuta el siguiente comando:

      gcloud compute addresses describe tcp-lb-static-ipv4
      

      Para obtener la dirección IPv6, ejecuta el siguiente comando:

      gcloud compute addresses describe tcp-lb-static-ipv6
      
    2. Envía tráfico a tu balanceador de cargas mediante la ejecución del siguiente comando. Reemplaza LB_IP_ADDRESS por la dirección IPv4 o IPv6 del balanceador de cargas.

      curl -m1 LB_IP_ADDRESS:110
      

      Por ejemplo, si la dirección IPv6 asignada es [2001:db8:1:1:1:1:1:1/96]:110, el comando debe verse de la siguiente manera:

      curl -m1 http://[2001:db8:1:1:1:1:1:1]:110
      

    Si no puedes acceder al balanceador de cargas, prueba los pasos que se describen en Soluciona problemas de configuración.

    Opciones de configuración adicionales

    En esta sección se expande el ejemplo de configuración para proporcionar opciones de configuración alternativas y adicionales. Todas las tareas son opcionales. Puedes realizarlas en cualquier orden.

    Protocolo PROXY para retener información de conexión del cliente

    El balanceador de cargas de red de proxy finaliza las conexiones TCP del cliente y crea conexiones nuevas con las instancias. De forma predeterminada, no se conservan la IP de cliente original y la información del puerto.

    Para conservar y enviar la información de conexión original a tus instancias, habilita el protocolo PROXY (versión 1). Este protocolo envía a la instancia un encabezado adicional que contiene la dirección IP de origen, la dirección IP de destino y los números de puerto como parte de la solicitud.

    Asegúrate de que las instancias de backend del balanceador de cargas de red del proxy ejecuten servidores que admitan encabezados del protocolo PROXY. Si los servidores no están configurados para admitir encabezados del protocolo PROXY, las instancias de backend muestran respuestas vacías.

    Si configuras el protocolo PROXY para el tráfico de los usuarios, también debes configurarlo para las verificaciones de estado. Si verificas el estado y entregas contenido en el mismo puerto, configura el --proxy-header de la verificación de estado para que coincida con la configuración del balanceador de cargas.

    Por lo general, el encabezado del protocolo PROXY será una sola línea de texto legible para el usuario con el siguiente formato:

    PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n
    

    En el siguiente ejemplo, se muestra un protocolo PROXY:

    PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

    En el ejemplo anterior, la IP de cliente es 192.0.2.1, la IP de balanceo de cargas es 198.51.100.1, el puerto del cliente es 15221 y el puerto de destino es 110.

    Cuando no se sabe la dirección IP de cliente, el balanceador de cargas genera un encabezado de protocolo PROXY con el formato siguiente:

    PROXY UNKNOWN\r\n
    

    Actualiza el encabezado del protocolo PROXY para el proxy de destino

    En el ejemplo de configuración del balanceador de cargas de esta página, se muestra cómo habilitar el encabezado del protocolo PROXY mientras se crea el balanceador de cargas de red del proxy externo. Sigue estos pasos a fin de cambiar el encabezado del protocolo PROXY para un proxy TCP de destino existente.

    Console

    1. En la consola de Google Cloud, ve a la página Balanceo de cargas.

      Ir a Balanceo de cargas

    2. Haz clic en Editar para editar tu balanceador de cargas.
    3. Haz clic en Configuración de frontend.
    4. Cambia el valor del campo del Protocolo Proxy a Activado.
    5. Haz clic en Actualizar para guardar los cambios.

    gcloud

    En el siguiente comando, edita el campo --proxy-header y configúralo como NONE o PROXY_V1 según tu requisito.

    gcloud compute target-tcp-proxies update TARGET_PROXY_NAME \
        --proxy-header=[NONE | PROXY_V1]
    

    Configura la afinidad de sesión

    En la configuración de ejemplo, se crea un servicio de backend sin afinidad de sesión.

    En estos procedimientos, se muestran cómo actualizar un servicio de backend para el balanceador de cargas de ejemplo a fin de que el servicio de backend use la afinidad de IP de cliente o la afinidad de cookie generada.

    Cuando la afinidad de IP de cliente está habilitada, el balanceador de cargas dirige las solicitudes de un cliente en particular a la misma VM de backend según el hash que se generó en la dirección IP del cliente y la dirección IP del balanceador de cargas (la dirección IP externa de una regla de reenvío externa).

    Console

    Para habilitar la afinidad de sesión de IP de cliente, sigue estos pasos:

    1. En la consola de Google Cloud, ve a la página Balanceo de cargas.

      Ir a Balanceo de cargas

    2. Haz clic en Backends.

    3. Haz clic en my-tcp-lb (el nombre del servicio de backend que creaste para este ejemplo) y haz clic en Editar.

    4. En la página Detalles del servicio de backend, haz clic en Configuración avanzada.

    5. En Afinidad de sesión, selecciona IP de cliente en el menú.

    6. Haz clic en Actualizar.

    gcloud

    Usa el siguiente comando de Google Cloud CLI para actualizar el servicio de backend my-tcp-lb y especifica la afinidad de sesión de IP de cliente:

    gcloud compute backend-services update my-tcp-lb \
        --global \
        --session-affinity=CLIENT_IP
    

    API

    Para establecer la afinidad de sesión de IP de cliente, realiza una solicitud PATCH al método backendServices/patch.

    PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/us-west1/backendServices/my-tcp-lb
    {
      "sessionAffinity": "CLIENT_IP"
    }
    

    Habilita el vaciado de conexiones

    Puedes habilitar el desvío de conexiones en servicios de backend a fin de garantizar una interrupción mínima para tus usuarios cuando se finaliza una instancia que entrega tráfico, se quita de forma manual o la quita un escalador automático. Para obtener más información sobre el vaciado de conexiones, consulta la documentación Habilita el vaciado de conexiones.

    ¿Qué sigue?