Configura un balanceador de cargas de red de transferencia externo con un grupo de destino

En esta guía, se proporcionan instrucciones para crear una configuración de balanceador de cargas de red de transferencia externo con backends de grupos de destino. En el ejemplo, se supone que tienes varios servidores web en instancias de Compute Engine en los que quieres balancear el tráfico. En esta situación, se establece una configuración de balanceo de cargas de capa 4 para distribuir el tráfico HTTP en las instancias en buen estado. Las verificaciones de estado HTTP básicas se configuran para garantizar que el tráfico se envíe solo a instancias en buen estado.

En este ejemplo, se balancean las cargas de tráfico HTTP, pero puedes usar balanceadores de cargas de red de transferencia externos basados en grupos de destino para balancear las cargas de tráfico de TCP, UDP y SSL. Antes de comenzar, lee Descripción general del balanceador de cargas de red de transferencia externo para obtener información conceptual sobre los balanceadores de cargas de red de transferencia externos.

Antes de comenzar

Instala Google Cloud CLI. Para obtener una descripción general completa de la herramienta, consulta la guía de la herramienta de gcloud. Puedes encontrar comandos relacionados con el balanceo de cargas en el grupo de comandos gcloud compute.

También puedes obtener ayuda detallada para cualquier comando de gcloud mediante la marca --help:

gcloud compute http-health-checks create --help

Si nunca ejecutaste Google Cloud CLI, primero ejecuta gcloud init para autenticarte.

Además, debes crear una dirección IP externa estática para el balanceador de cargas. Si usas una imagen proporcionada por Compute Engine, las instancias de tu máquina virtual (VM) se configurarán de forma automática para controlar esta dirección IP. Si usas cualquier otra imagen deberás configurar esta dirección como un alias en eth0 o como un bucle invertido en cada instancia.

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

Configura instancias de VM de Compute Engine

Para esta situación de balanceo de cargas, crearás tres instancias de VM de Compute Engine y, además, instalarás Apache en ellas. Agrega una regla de firewall que permita que el tráfico HTTP llegue a las instancias.

Las instancias que participan como VMs de backend para los balanceadores de cargas de red de transferencia externos deben ejecutar el entorno invitado de Linux, el entorno invitado de Windows adecuados, o algún otro proceso que proporcione una funcionalidad equivalente.

Configura las instancias de backend

Consola

  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 como www1.

  4. Establece la Región como us-central1.

  5. Establece la Zona en us-central1-b.

  6. En Disco de arranque, la imagen de SO predeterminada de Debian GNU/Linux 10 (buster) ya está seleccionada.

  7. Haz clic en Opciones avanzadas.

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

    1. En Etiquetas de red, ingresa network-lb-tag.
  9. Haz clic en Administración. Ingresa la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

     #! /bin/bash
     sudo apt-get update
     sudo apt-get install apache2 -y
     sudo service apache2 restart
     echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. Haz clic en Crear.
  10. Crea una instancia llamada www2 con la misma configuración, excepto por la siguiente secuencia de comandos insertada en el campo Automatización, Secuencia de comandos de inicio.

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
     

  11. Crea una instancia llamada www3 con la misma configuración, excepto por la siguiente secuencia de comandos insertada en el campo Automatización, Secuencia de comandos de inicio.

        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
      

gcloud

Los comandos que se indican a continuación se ejecutan en tu sistema local y suponen el uso de un símbolo del sistema bash.

Para ver el estado, los atributos y los nombres de las imágenes de SO, usa el comando gcloud compute images list.

  1. Crea tres máquinas virtuales nuevas en una zona determinada y asígnales la misma etiqueta. En este ejemplo, se establece la zona en us-central1-b. Si configuras el campo tags, podrás hacer referencia a estas instancias de una sola vez, por ejemplo, con una regla de firewall. Con estos comandos, también se instala Apache en cada instancia y se les otorga una página principal única.

    gcloud compute instances create www1 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

api

Crea una instancia www1 en la zona us-central1-b con el método instances.insert

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

Crea instancias denominadas www2 y www3 con la misma configuración, tan solo debes reemplazar www1 en los campos deviceName, value y name.

Crea una regla de firewall para permitir el tráfico externo a estas instancias de VM

Consola

  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. Ingresa un Nombre de www-firewall-network-lb.

  4. Selecciona la Red a la que se aplicará la regla de firewall (Predeterminada).

  5. En Destinos, selecciona Etiquetas de destino especificadas.

  6. En el campo Etiquetas de destino, ingresa network-lb-tag.

  7. Configura Filtro de fuente como Rangos de IPv4.

  8. Establece los Rangos de IPv4 de origen en 0.0.0.0/0, lo que permite el tráfico desde cualquier fuente.

  9. En Protocolos y puertos especificados, selecciona la casilla de verificación TCP e ingresa 80.

  10. Haz 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

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

api

Crea una regla de firewall que permita todo el tráfico dentro de la subred con el **método** firewalls.insert

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

Obtén las direcciones IP externas de las instancias y verifica que estén en ejecución

Consola

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

    Ir a Instancias de VM

  2. Consulta las direcciones de tus instancias en la columna de IP externa.

  3. Verifica que tus instancias se ejecuten; para ello, busca una marca de verificación verde a la izquierda del nombre de la instancia. Si no ves una marca de verificación verde, consulta la página de solución de problemas generales para instancias.

gcloud

  1. Enumera tus instancias para obtener tus direcciones IP de la columna EXTERNAL_IP.

    gcloud compute instances list
    
  2. Verifica que cada instancia esté en ejecución.

    En la línea de comandos, ejecuta curl con la dirección IP externa de cada instancia para confirmar que todas las instancias respondan.

    curl http://[IP_ADDRESS]
    

api

Obtén información sobre la instancia www1 con el método instances.get

Asegúrate de que el campo status diga RUNNING y busca la dirección IP externa en el campo natIP.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

Repite esta llamada a la API para www2 y www3.

Configura el servicio de balanceo de cargas

A continuación, configura el servicio de balanceo de cargas.

Cuando configuras el servicio de balanceo de cargas, tus instancias de máquina virtual 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, deberás configurar esta dirección como un alias en eth0 o como un bucle invertido en cada instancia.

Console

No puedes usar la consola de Google Cloud para crear balanceadores de cargas de red de transferencia externos basados en grupos de destino. En su lugar, usa gcloud o la API de REST.

gcloud

  1. Crea una dirección IP externa estática para tu balanceador de cargas.

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. Agrega un recurso de verificación de estado HTTP heredado

    En este ejemplo, se usa la configuración predeterminada para el mecanismo de verificación de estado, pero también puedes personalizar la verificación de estado por tu cuenta.

    gcloud compute http-health-checks create basic-check
    
  3. Agrega un grupo de destino

    Agrega un grupo de destino en la misma región que las instancias de tu máquina virtual. Usa la verificación de estado creada en el paso anterior para este grupo de destino. Los grupos de destino requieren un servicio de verificación de estado para poder funcionar.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. Agrega tus instancias al grupo de destino.

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    Las instancias dentro de un grupo de destino deben pertenecer a la misma región, pero pueden extenderse a diferentes zonas en la misma región. Por ejemplo, puedes tener instancias en la zona us-central1-f y en la zona us-central1-b en un grupo de destino porque se encuentran en la misma región, us-central1.

  5. Agrega una regla de reenvío

    Agrega una regla de reenvío que entregue en nombre de una dirección IP externa y un rango de puertos que apunte a tu grupo de destino. Para el campo --address, usa la dirección IP numérica o su nombre completamente calificado.

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

api

  1. Crea una dirección IP externa estática para tu balanceador de cargas.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. Agrega una verificación de estado HTTP heredada

    En este ejemplo, usamos la configuración predeterminada para el mecanismo de verificación de estado, pero también puedes personalizarlo por tu cuenta.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. Agrega un grupo de destino.

    Agrega un grupo de destino en la misma región que las instancias de tu máquina virtual. Usa la verificación de estado creada en el paso anterior para este grupo de destino. Los grupos de destino requieren un servicio de verificación de estado para poder funcionar.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. Agrega tus instancias al grupo de destino.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    Repite esta llamada a la API para las instancias www2 y www3.

    Las instancias dentro de un grupo de destino deben pertenecer a la misma región, pero pueden extenderse a diferentes zonas en la misma región. Por ejemplo, puedes tener instancias en la zona us-central1-f y en la zona us-central1-b en un grupo de destino porque se encuentran en la misma región, us-central1.

  5. Agrega una regla de reenvío

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

Envía tráfico a tus instancias

Ahora que el servicio de balanceo de cargas está configurado, puedes comenzar a enviar tráfico a la regla de reenvío y mirar cómo se dispersa el tráfico a las instancias diferentes.

Busca la dirección IP externa de la regla de reenvío

Console

  1. Ve a la pestaña Reglas de reenvío en la página de balanceo de cargas Avanzado en la consola de Google Cloud.
    Ir a la pestaña Reglas de reenvío
  2. Ubica www-rule, la regla de reenvío que usa el balanceador de cargas.
  3. En la columna Dirección IP de www-rule, 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 www-rule que usa el balanceador de cargas.

gcloud compute forwarding-rules describe www-rule --region us-central1

api

Visualiza la dirección IP externa de la regla de reenvío www-rule con el método forwardingRules.get

En el resultado, busca el campo IPAddress.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

ICMP no es compatible con instancias de backend

Los balanceadores de cargas de red de transferencia externos no entregan paquetes ICMP a las instancias de backend. Si envías un paquete ICMP, por ejemplo, con ping o traceroute, la respuesta no proviene de las instancias de backend del balanceador de cargas.

La infraestructura de Google Cloud podría enviar una respuesta ICMP, incluso si tienes reglas de firewall que prohíben el tráfico ICMP en las instancias de backend del balanceador de cargas. No se puede cambiar este comportamiento.

Usa el comando curl para acceder a la dirección IP externa

La respuesta del comando curl se alterna de manera aleatoria entre las tres instancias. 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:

$ while true; do curl -m1 IP_ADDRESS; done

¿Qué sigue?