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, suponemos que tienes varios servidores web en instancias de Google 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 3 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 los conceptos de balanceo de cargas de red a fin de obtener información conceptual relacionada.

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. Encontrarás comandos relacionados con el balanceo de cargas en el grupo de comandos de gcloud compute.

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

gcloud compute http-health-checks create --help

Si aún no ejecutaste la herramienta de línea de comandos de gcloud, primero ejecuta gcloud init para autenticar.

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 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 VM de backend para balanceadores de cargas de red se deben ejecutar en el entorno de invitado de Linux, el entorno de invitado de Windows o algún otro proceso que proporcione una funcionalidad equivalente.

Configura las instancias

Console

  1. Ve a la página Instancias de VM en Google Cloud Platform Console.
    Ir a la página Instancias de VM
  2. Haz clic en Crear instancia.
  3. Establece el Nombre en www1.
  4. Establece la Región en us-central1.
  5. Establece la Zona en us-central1-b.
  6. En el 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, instancia única para revelar la configuración avanzada.
    1. En Administración, inserta la siguiente secuencia de comandos en el campo 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>www1</h1></body></html>' | tee /var/www/html/index.html
      EOF
    2. En Herramientas de redes, propaga el campo Etiquetas con network-lb-tag.
    3. Para el resto de los campos, deja los valores predeterminados.
    4. Haz clic en Crear.
  8. Crea una instancia llamada www2 con la misma configuración, a excepción de la secuencia de comandos siguiente insertada en el campo 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
    EOF
  9. Crea una instancia llamada www3 con la misma configuración, a excepción de la secuencia de comandos siguiente insertada en el campo 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
    EOF

gcloud

A continuación, los comandos se ejecutan en tu sistema local y se deja por sentado un símbolo del sistema bash.

Si quieres ver los nombres, los atributos y el estado 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 a la 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
        EOF"
    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
        EOF"
    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
        EOF"

api

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

POST https://www.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/n1-standard-1",
  "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 la misma configuración, con la excepción de que 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. Dirígete a la página Firewalls en Google Cloud Platform 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 y, luego, 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://www.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 tus instancias y verifica que se ejecuten

Console

  1. Ve a la página Instancias de VM en Google Cloud Platform 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 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 se ejecute.

    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 indique RUNNING y busca la dirección IP externa en el campo natIP.

GET https://www.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/n1-standard-1",
 "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\n EOF"
   }
  ]
 },
 "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

  1. Dirígete a la página Crear un balanceador de cargas en Google Cloud Platform 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. En el caso de 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 Balanceador de cargas de TCP nuevo, 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 es modificable.
  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 Crear una verificación de estado nueva o Crear otra verificació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 de Reservar dirección IP estática, 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, usamos la configuración predeterminada para el mecanismo de verificación de estado, pero también puedes personalizarlo 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, también, instancias en la zona us-central1-b en un grupo de destino, ya que se encuentran en us-central1, la misma región.

  5. Agrega una regla de reenvío

    Agrega una regla de reenvío que entregue a 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 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 cargas.

    POST https://www.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://www.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://www.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://www.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, también, instancias en la zona us-central1-b en un grupo de destino, ya que se encuentran en us-central1, la misma región.

  5. Agrega una regla de reenvío

    POST https://www.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. Dirígete a la pestaña Reglas de reenvío en la página de balanceo de cargas Avanzado en Google Cloud Platform Console.
    Ir a la pestaña Reglas de reenvío
  2. Busca www-rule, la regla de reenvío que usa el balanceador de cargas.
  3. En la columna Dirección IP para www-rule, ten en cuenta la dirección IP externa que figura en la lista.

gcloud

Ingresa el comando siguiente 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://www.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"
}

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

La respuesta del comando curl se alternará 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

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...