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
Console
En la consola de Google Cloud, ve a la página Instancias de VM.
Haz clic en Crear instancia.
Establece el Nombre como
www1
.Establece la Región como us-central1.
Establece la Zona en us-central1-b.
En Disco de arranque, la imagen de SO predeterminada de
Debian GNU/Linux 10 (buster)
ya está seleccionada.Haz clic en Opciones avanzadas.
Haz clic en Herramientas de redes y configura el siguiente campo:
- En Etiquetas de red, ingresa
network-lb-tag
.
- En Etiquetas de red, ingresa
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
- Haz clic en Crear.
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
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
.
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-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 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-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 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
En la consola de Google Cloud, ve a la página Políticas de firewall.
Haz clic en Crear regla de firewall.
Ingresa un Nombre de
www-firewall-network-lb
.Selecciona la Red a la que se aplicará la regla de firewall (Predeterminada).
En Destinos, selecciona Etiquetas de destino especificadas.
En el campo Etiquetas de destino, ingresa
network-lb-tag
.Configura Filtro de fuente como Rangos de IPv4.
Establece los Rangos de IPv4 de origen en
0.0.0.0/0
, lo que permite el tráfico desde cualquier fuente.En Protocolos y puertos especificados, selecciona la casilla de verificación TCP e ingresa
80
.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
En la consola de Google Cloud, ve a la página Instancias de VM.
Consulta las direcciones de tus instancias en la columna de IP externa.
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
Enumera tus instancias para obtener tus direcciones IP de la columna
EXTERNAL_IP
.gcloud compute instances list
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-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 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
Crea una dirección IP externa estática para tu balanceador de cargas.
gcloud compute addresses create network-lb-ip-1 \ --region us-central1
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
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
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 zonaus-central1-b
en un grupo de destino porque se encuentran en la misma región,us-central1
.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
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" }
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" }
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" ] }
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
ywww3
.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 zonaus-central1-b
en un grupo de destino porque se encuentran en la misma región,us-central1
.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
- 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 - Ubica
www-rule
, la regla de reenvío que usa el balanceador de cargas. - 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?
- Para obtener información sobre cómo funcionan los balanceadores de cargas de red de transferencia externos con grupos de destino, consulta la descripción general de los balanceadores de cargas de red de transferencia externos basados en grupos de destino.
- Para obtener información sobre cómo funcionan los balanceadores de cargas de red de transferencia externos con los servicios de backend regionales
en lugar de los grupos de destino, consulta lo siguiente:
- Descripción general del balanceador de cargas de red de transferencia externo con servicios de backend
- Configura un balanceador de cargas de red de transferencia externo con un servicio de backend
- Migra un balanceador de cargas de red de transferencia externo del grupo de destino al servicio de backend
- Si deseas configurar la protección avanzada contra DSD de red para un balanceador de cargas de red de transferencia externo mediante Google Cloud Armor, consulta Configura la protección avanzada contra DSD de red.
- A fin de obtener información sobre problemas y soluciones cuando se usa un balanceador de cargas de red de transferencia externo para el tráfico UDP, consulta Usa UDP con balanceadores de cargas de red de transferencia externos.
- Para borrar recursos a fin de que no se te facture por ellos, consulta Limpia una configuración de balanceo de cargas.