Configura el balanceo de cargas de red

En esta guía, se proporcionan instrucciones para crear una configuración básica de balanceo de cargas de red. 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 cargas de tráfico HTTP, pero puedes usar el balanceo de cargas de red para balancear cargas del tráfico UDP, TCP y SSL. Antes de comenzar, lee la descripción general del balanceo de cargas de red para obtener información conceptual relacionada con el balanceo de cargas de red.

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. 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 no ejecutaste la herramienta de línea de comandos de gcloud antes, 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, se da por sentado 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. Agregarás una regla de firewall que permita que el tráfico HTTP llegue a las instancias.

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 las instancias de backend

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. 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 9 (stretch) ya está seleccionada.
  7. Haz clic en Administración, seguridad, discos, redes, usuario único para revelar la configuración avanzada.
    1. En la pestaña Administración, inserta 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
      
    2. En Herramientas de redes, completa el campo Etiquetas con network-lb-tag.
    3. Deja los valores predeterminados para el resto de los campos.
    4. Haz clic en Crear.
  8. 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
    
  9. 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-9 \
      --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-9 \
      --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-9 \
      --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/eip-images/global/images/debian-9-drawfork-v20181101",
        "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

Console

  1. Ve a la página Firewalls en Google Cloud Console.
    Ir a la página Firewalls
  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. Establece los Rangos de IP de origen en 0.0.0.0/0, lo que permite el tráfico desde cualquier fuente.
  8. En Protocolos y puertos especificados, haz clic en la casilla de verificación junto a TCP e ingresa 80.
  9. 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

Console

  1. Ve a la página Instancias de VM en Google Cloud Console.
    Ir a la página Instancias de VM
  2. Consulta las direcciones de tus instancias en la columna de IP externa.
  3. Verifica que tus instancias estén en ejecución; 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-9-stretch"
   ],
   "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, configurarás 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

  1. Ve a la página Crear un balanceador de cargas en Google Cloud Console.
    Ir a la página Crear un balanceador de cargas
  2. En Balanceo de cargas de TCP, haz clic en el botón Iniciar configuración.

  3. En Orientado a Internet o solo interno, selecciona From Internet to my VMs.

  4. Para Varias regiones o una sola región, selecciona Single region only.

  5. Haz clic en el botón Continuar.

Configura el backend

  1. En la pantalla New TCP load balancer, ingresa un Nombre de www-network-lb para el balanceador de cargas nuevo.
  2. Haz clic en Configuración de backend.
  3. El Nombre del balanceador de cargas que ingresaste antes aparece, pero no puedes modificarlo.
  4. En Región, selecciona us-central1.
  5. En Backends, haz clic en la pestaña Seleccionar instancias existentes y en Agregar una instancia. Ingresa la instancia www1. Repite este paso para las instancias www2 y www3.
  6. En Verificación de estado, haz clic en Create a new health check o Crear otra comprobación de estado:

    1. Ingresa basic-check como el Nombre de la verificación de estado.
    2. Mantén la configuración predeterminada.
    3. Haz clic en el botón Guardar y continuar.

    El círculo azul con una marca de verificación a la izquierda de la Configuración de backend indica que la configuración se realizó de forma correcta.

Configura la regla de reenvío

  1. Haz clic en Configuración de frontend.
  2. Ingresa un Nombre de www-rule.
  3. En IP, haz clic en el menú desplegable y selecciona Crear dirección IP.
    1. En la pantalla Reservar una dirección IP estática nueva, asigna un Nombre de lb-ip-1.
    2. Haz clic en Reservar.
  4. Ingresa un Puerto de 80.
  5. Haz clic en el botón Listo.

    El círculo azul con una marca de verificación a la izquierda de la Configuración de Frontend indica que la configuración se realizó de forma correcta.

Revisa la configuración

  1. Haz clic en el botón Revisar y finalizar para verificar la configuración del balanceador de cargas.
  2. Si la configuración es correcta, haz clic en Crear. El balanceador de cargas tarda unos cuantos minutos en crearse.

    En la pantalla de balanceo de cargas, en la columna Backend de tu balanceador de cargas nuevo, deberías ver una marca de verificación verde que muestra que el balanceador de cargas nuevo está en buen estado.

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 Google Cloud Console.
    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

El balanceo de cargas de red no entrega 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

Próximos pasos