Configurar un balanceador de carga de red de paso a través externo con un grupo de destino

En esta guía se proporcionan instrucciones para crear una configuración de balanceador de carga de red de paso a través externo con backends de grupo de destino. En el ejemplo se da por hecho que tiene varios servidores web en instancias de Compute Engine entre los que quiere balancear el tráfico. En este caso, se configura un balanceo de carga de capa 4 para distribuir el tráfico HTTP entre instancias en buen estado. Las comprobaciones de estado HTTP básicas se configuran para asegurar que el tráfico se envíe solo a las instancias en buen estado.

En este ejemplo se balancea la carga del tráfico HTTP, pero puedes usar balanceadores de carga de red externos de transferencia basados en grupos de destino para balancear la carga del tráfico TCP, UDP y SSL. Antes de empezar, consulta el resumen de los balanceadores de carga de red de paso a través externos para obtener información conceptual sobre estos balanceadores.

Antes de empezar

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

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

gcloud compute http-health-checks create --help

Si no has ejecutado la CLI de Google Cloud anteriormente, ejecuta primero gcloud init para autenticarte.

Además, debes crear una dirección IP externa estática para el balanceador de carga. Si usas una imagen proporcionada por Compute Engine, tus instancias de máquina virtual se configuran automáticamente para gestionar esta dirección IP. Si usas otra imagen, tendrás que configurar esta dirección como alias en eth0 o como bucle de retorno en cada instancia.

En esta guía se da por hecho que estás familiarizado con bash.

Configurar instancias de VM de Compute Engine

En este caso de balanceo de carga, crearás tres instancias de VM de Compute Engine e instalarás Apache en ellas. Añadirás una regla de cortafuegos que permita que el tráfico HTTP llegue a las instancias.

Las instancias que participan como VMs de backend de balanceadores de carga de red de paso a través externos deben ejecutar el entorno de invitado de Linux, el entorno de invitado de Windows u otros procesos que proporcionen una funcionalidad equivalente.

Configurar 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. Asigna el valor www1 a Nombre.

  4. En Region (Región), selecciona us-central1.

  5. En el campo Zona, introduce us-central1-b.

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

  7. Haz clic en Advanced options (Opciones avanzadas).

  8. Haga clic en Redes y configure el siguiente campo:

    1. En Etiquetas de red, introduzca network-lb-tag.
  9. Haz clic en Gestión. Introduce 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 los mismos ajustes, excepto con la siguiente secuencia de comandos insertada en los campos Automatización y 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 los mismos ajustes, excepto con la siguiente secuencia de comandos insertada en los campos Automatización y 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

Todos los comandos que se indican a continuación se ejecutan en tu sistema local y se presupone que hay un símbolo del sistema bash.

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

  1. Crea tres máquinas virtuales en una zona determinada y asígnales la misma etiqueta. En este ejemplo se define la zona como us-central1-b. Al definir el campo tags, puedes hacer referencia a todas estas instancias a la vez, por ejemplo, con una regla de cortafuegos. Estos comandos también instalan Apache en cada instancia y asignan a cada instancia una página principal única.

    gcloud compute instances create www1 \
      --image-family debian-12 \
      --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-12 \
      --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-12 \
      --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 instanciawww1 en la zona us-central1-b con el métodoinstances.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-12-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 llamadas www2 y www3 con los mismos ajustes, excepto que debes sustituir www1 en los campos deviceName, value y name.

Crear una regla de cortafuegos para permitir el tráfico externo a estas instancias de VM

Consola

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

    Ir a Políticas de cortafuegos

  2. Haz clic en Crear regla de cortafuegos.

  3. Asigne un Nombre de www-firewall-network-lb.

  4. Selecciona la Red a la que se aplica la regla de cortafuegos (Predeterminada).

  5. En Objetivos, seleccione Etiquetas de destino especificadas.

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

  7. En Filtro de origen, elija Intervalos de IPv4.

  8. Asigna el valor 0.0.0.0/0 a Intervalos IPv4 de origen para permitir el tráfico de cualquier origen.

  9. En Protocolos y puertos especificados, selecciona la casilla TCP e introduce 80.

  10. Haz clic en Crear. La consola puede tardar unos instantes en mostrar la nueva regla de cortafuegos, o bien puede que tengas que hacer clic en Actualizar para verla.

gcloud

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

api

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

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"
  ]
}

Obtener las direcciones IP externas de tus instancias y verificar 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 IP externa.

  3. Verifica que tus instancias se estén ejecutando. 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. Lista tus instancias para obtener sus direcciones IP de la columna EXTERNAL_IP.

    gcloud compute instances list
    
  2. Verifica que cada instancia se esté ejecutando.

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

    curl http://[IP_ADDRESS]
    

api

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

Comprueba que en el campo status se indica 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-12-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 con www2 y www3.

Configurar el servicio de balanceo de carga

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

Cuando configures el servicio de balanceo de carga, 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 configuran automáticamente para gestionar esta dirección IP. Si usas otra imagen, tendrás que configurar esta dirección como alias en eth0 o como bucle de retorno en cada instancia.

Consola

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

gcloud

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

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. Añadir un recurso de comprobación del estado de HTTP antiguo

    En este ejemplo se usan los ajustes predeterminados del mecanismo de comprobación del estado, pero también puedes personalizar la comprobación del estado.

    gcloud compute http-health-checks create basic-check
    
  3. Añadir un grupo de destino

    Añade un grupo de destino en la misma región que tus instancias de máquina virtual. Usa la comprobación de estado que has creado en el paso anterior para este grupo de destino. Los grupos de destino requieren un servicio de comprobación del estado para funcionar.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. Añade 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 de un grupo de destino deben pertenecer a la misma región, pero pueden distribuirse en diferentes zonas de la misma región. Por ejemplo, puedes tener instancias en la zona us-central1-f e instancias en la zona us-central1-b en un mismo grupo de destino porque están en la misma región, us-central1.

  5. Añadir una regla de reenvío

    Añade una regla de reenvío que sirva en nombre de una dirección IP externa y un intervalo de puertos que apunten a tu grupo de destino. En el campo --address, usa la dirección IP numérica o su nombre completo.

    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 carga

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. Añadir una comprobación del estado de HTTP antigua

    En este ejemplo se utiliza la configuración predeterminada del mecanismo de comprobación del estado, pero también puedes personalizarla.

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

    Añade un grupo de destino en la misma región que tus instancias de máquina virtual. Usa la comprobación de estado que has creado en el paso anterior para este grupo de destino. Los grupos de destino requieren un servicio de comprobación del estado para 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. Añade 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 de un grupo de destino deben pertenecer a la misma región, pero pueden distribuirse en diferentes zonas de la misma región. Por ejemplo, puedes tener instancias en la zona us-central1-f e instancias en la zona us-central1-b en un mismo grupo de destino porque están en la misma región, us-central1.

  5. Añadir 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"
    }
    

Enviar tráfico a tus instancias

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

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

Consola

  1. Ve a la pestaña Reglas de reenvío de la página de balanceo de carga Avanzado de la Google Cloud consola.
    Vaya a la pestaña Reglas de reenvío.
  2. Busca www-rule, la regla de reenvío que usa el balanceador de carga.
  3. En la columna Dirección IP de www-rule, anota la dirección IP externa que aparece.

gcloud

Introduce el siguiente comando para ver la dirección IP externa de la regla de reenvío www-rule que usa el balanceador de carga.

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

api

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

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 compatible con instancias de backend

Los balanceadores de carga de red de paso a través externos no envían paquetes ICMP a las instancias de backend. Si envías un paquete ICMP, por ejemplo, con ping o traceroute, la respuesta no procede de las instancias de backend del balanceador de carga.

Google Cloud puede enviar una respuesta ICMP, aunque tengas reglas de cortafuegos que prohíban el tráfico ICMP en las instancias de backend del balanceador de carga. Este comportamiento no se puede cambiar.

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

La respuesta del comando curl se alterna aleatoriamente entre las tres instancias. Si tu respuesta no tiene éxito al principio, es posible que tengas que esperar unos 30 segundos para que la configuración se cargue por completo y tus instancias se marquen como correctas antes de volver a intentarlo:

$ while true; do curl -m1 IP_ADDRESS; done

Siguientes pasos