Crea un servicio con balanceo de cargas

En este instructivo, se muestra cómo tú, como productor de servicios, puedes crear un servicio simple que use un balanceador de cargas de red de transferencia interno. De forma predeterminada, un balanceador de cargas de red de transferencia interno solo está disponible desde la red de VPC que lo aloja.

Este instructivo está dirigido a arquitectos de nube, arquitectos de red, administradores de red y administradores de TI.

Objetivos

  • Configura las herramientas de redes para los recursos del productor de servicios
  • Crea recursos de VM para el backend del balanceador de cargas
  • Configura los componentes del balanceador de cargas
  • Prueba el acceso al balanceador de cargas

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para obtener una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Antes de comenzar

  1. Crea o selecciona un proyecto para usarlo con los recursos del productor de servicios. En los siguientes instructivos, este proyecto se denomina PRODUCER_PROJECT.
    1. In the Google Cloud console, go to the project selector page.

      Go to project selector

    2. Select or create a Google Cloud project.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
  2. Enable the Compute Engine API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  3. Make sure that you have the following role or roles on the project: Compute Engine > Compute Network Admin, Compute Engine > Compute Security Admin, Compute Engine > Compute Instance Admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Otorgar acceso.
    4. En el campo Principales nuevas, ingresa tu identificador de usuario. Esta suele ser la dirección de correo electrónico de una Cuenta de Google.

    5. Haz clic en Seleccionar un rol y, luego, busca el rol.
    6. Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega uno más.
    7. Haz clic en Guardar.

Configura las redes

En las siguientes secciones, se explica cómo crear una red, una subred y reglas de firewall para el servicio.

Configura una red y una subred

Para crear la red y la subred de servicio para el balanceador de cargas, completa los pasos que se indican en las siguientes secciones.

Console

  1. En la consola de Google Cloud , ve a la página Redes de VPC.

    Ir a Redes de VPC

  2. Haz clic en Crear red de VPC.

  3. En Nombre, ingresa service-network.

  4. En Modo de creación de subred, selecciona Personalizado.

  5. En la sección Subred nueva, ingresa la siguiente información.

    1. En Nombre, ingresa service-subnet.
    2. En Región, selecciona la región que deseas usar.
    3. En Tipo de pila de IP, elige IPv4 (pila única).
    4. En el Rango de IPv4, ingresa 10.10.10.0/24.
    5. Haz clic en Listo.
  6. Haz clic en Crear.

gcloud

  1. Crea una red de VPC en modo personalizado:

    gcloud compute networks create service-network --subnet-mode=custom
    
  2. En la red service-network, crea una subred.

    gcloud compute networks subnets create service-subnet \
        --network=service-network \
        --range=10.10.10.0/24 \
        --region=REGION
    

    Reemplaza REGION por la región que deseas usar.

Configura reglas de firewall

Crea reglas de firewall para permitir el siguiente tráfico:

  • fw-allow-subnet: Permite que el tráfico de 10.10.10.0/24 llegue a otros recursos en 10.10.10.0/24.
  • fw-allow-ssh: Permite que el tráfico SSH de 0.0.0.0/0 llegue a las VMs que tienen la etiqueta de red allow-ssh.
  • fw-allow-healthcheck: Permite que el tráfico de los sistemas de verificación de estado de Google Cloudllegue a las VMs que tienen la etiqueta de red allow-healthcheck.

Console

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

    Ir a Políticas de firewall

  2. Para permitir el tráfico de subred, haz clic en Crear regla de firewall y usa la siguiente configuración:

    • En Nombre, ingresa fw-allow-subnet.
    • En Red, selecciona service-network.
    • En Prioridad, ingresa 1000.
    • En Dirección del tráfico, selecciona Ingress.
    • En Acción en caso de coincidencia, selecciona Permitir.
    • En Destinos, haz clic en Todas las instancias de la red.
    • En Filtro de fuente, selecciona Rangos de IPv4.
    • En Rangos de IPv4 de origen, ingresa 10.10.10.0/24.
    • En Protocolos y puertos, selecciona Permitir todo.
  3. Haz clic en Crear.

  4. Para permitir conexiones SSH entrantes, haz clic en Crear regla de firewall y usa la siguiente configuración:

    • En Nombre, ingresa fw-allow-ssh.
    • En Red, selecciona service-network.
    • En Prioridad, ingresa 1000.
    • En Dirección del tráfico, selecciona Ingress.
    • En Acción en caso de coincidencia, selecciona Permitir.
    • En Destinos, selecciona Etiquetas de destino especificadas.
    • En Etiquetas de destino, ingresa allow-ssh.
    • En Filtro de fuente, selecciona Rangos de IPv4.
    • En Rangos de IPv4 de origen, ingresa 0.0.0.0/0.
    • En Protocolos y puertos, selecciona Protocolos y puertos especificados y, luego, la casilla de verificación TCP. En Puertos, ingresa 22.
  5. Haz clic en Crear.

  6. Para permitir las verificaciones de estado de Google Cloud , haz clic en Crear regla de firewall y usa la siguiente configuración:

    • En Nombre, ingresa fw-allow-healthcheck.
    • En Red, selecciona service-network.
    • En Prioridad, ingresa 1000.
    • En Dirección del tráfico, selecciona Ingress.
    • En Acción en caso de coincidencia, selecciona Permitir.
    • En Destinos, selecciona Etiquetas de destino especificadas.
    • En Etiquetas de destino, ingresa allow-healthcheck.
    • En Filtro de fuente, selecciona Rangos de IPv4.
    • En Rangos de IPv4 de origen, ingresa 130.211.0.0/22 y 35.191.0.0/16.
    • En Protocolos y puertos, selecciona Permitir todo.
  7. Haz clic en Crear.

gcloud

  1. Crea la regla de firewall fw-allow-subnet para permitir la comunicación desde la subred:

    gcloud compute firewall-rules create fw-allow-subnet \
        --network=service-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.10.10.0/24 \
        --rules=tcp,udp,icmp
    

  1. Crea la regla de firewall fw-allow-ssh para permitir la conectividad SSH a las VM con la etiqueta de red allow-ssh.

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=service-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=0.0.0.0/0 \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

  1. Crea la regla fw-allow-healthcheck para permitir las verificaciones de estado de Google Cloud.

    gcloud compute firewall-rules create fw-allow-healthcheck \
        --network=service-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-healthcheck \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp,udp,icmp
    

Crea recursos de VM para el backend del balanceador de cargas

Crea las VMs y el grupo de instancias para usar con el balanceador de cargas.

Crea VM de backend

El servicio que creas se ejecuta en dos VMs para una mayor disponibilidad: vm-1 y vm-2. Las VMs están en la misma zona, pero, en un entorno de producción, recomendamos usar varias zonas.

Además de crear las VMs, seguir estos pasos permite lograr lo siguiente:

Console

  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. En Nombre, ingresa vm-1.

  4. En Región y Zona, selecciona una región y una zona dentro de esa región.

  5. En el menú de navegación, ve a SO y almacenamiento.

  6. En el panel Sistema operativo y almacenamiento, asegúrate de que Debian GNU/Linux 12 (bookworm) esté seleccionado para el disco de arranque. Si necesitas seleccionar otra imagen, haz clic en Cambiar.

  7. En el menú de navegación, ve a Herramientas de redes.

  8. En Etiquetas de red, ingresa allow-ssh, allow-healthcheck y allow-nat.

  9. En Interfaces de red, selecciona lo siguiente:

    • En Red, selecciona service-network.
    • En Subred, selecciona service-subnet.
    • En Tipo de pila de IP, elige IPv4 (pila única).
    • En Dirección IPv4 interna principal, selecciona Efímera (automática).
    • En Dirección IPv4 externa, selecciona Efímera.
  10. En el menú de navegación, ve a Opciones avanzadas.

  11. En la sección Automatización, en el campo Secuencia de comandos de inicio, ingresa la siguiente secuencia de comandos.

    
    #! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed
    

  12. Haz clic en Crear.

  13. Repite estos pasos para crear otra VM llamada vm-2 en la misma región y zona que vm-1.

gcloud

  1. Ejecuta los siguientes comandos para crear dos VMs:

    gcloud compute instances create vm-1 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-healthcheck,allow-nat \
        --subnet=service-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    
    gcloud compute instances create vm-2 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-healthcheck,allow-nati \
        --subnet=service-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

    Reemplaza ZONE por la zona que deseas usar.

Crea un grupo de instancias

Para usar las VMs en un backend de balanceador de cargas, debes agregarlas a un grupo de instancias.

Console

  1. En la consola de Google Cloud , ve a la página Grupos de instancias.

    Ir a Grupos de instancias

  2. Haz clic en Crear grupo de instancias.

  3. En el panel de navegación, haz clic en Nuevo grupo de instancias no administrado.

  4. En Nombre, ingresa ig-1.

  5. En la sección Ubicación, selecciona la misma región y zona que tus VMs.

  6. En Red, selecciona service-network

  7. En Subred, selecciona service-subnet.

  8. En la sección Instancias de VM, agrega vm-1 y vm-2 al grupo de instancias.

  9. Haz clic en Crear.

gcloud

  1. Crea un grupo de instancias no administrado:

    gcloud compute instance-groups unmanaged create ig-1 \
        --zone=ZONE
    

    Reemplaza ZONE por la zona que contiene las VMs.

  2. Agrega las VMs al grupo de instancias:

    gcloud compute instance-groups unmanaged add-instances ig-1 \
        --zone=ZONE \
        --instances=vm-1,vm-2
    

Configura los componentes del balanceador de cargas

Configura todos los componentes del balanceador de cargas de red de transferencia interno, comenzando con la verificación de estado y el servicio de backend y, luego, los componentes de frontend:

  • Verificación de estado Usas una verificación de estado de HTTP que comprueba si hay un código de estado HTTP 200 OK.

  • Servicio de backend. Como necesitas pasar tráfico HTTP a través del balanceador de cargas interno, debes usar TCP, no UDP.

  • Regla de reenvío. Creas una sola regla de reenvío interno, service-rule.

  • Dirección IP interna Especificas una dirección IP interna, 10.10.10.99, cuando creas la regla de reenvío.

Console

Inicia tu configuración

  1. En la consola de Google Cloud , ve a la página Balanceo de cargas.

    Ir a Balanceo de cargas

  2. Haz clic en Crear balanceador de cargas.
  3. En Tipo de balanceador de cargas, selecciona Balanceador de cargas de red (TCP/UDP/SSL) y haz clic en Siguiente.
  4. En Proxy o de transferencia, selecciona Balanceador de cargas de transferencia y haz clic en Siguiente.
  5. En Orientado al público o interno, selecciona Interno y haz clic en Siguiente.
  6. Haz clic en Configurar.

Configuración básica

En la página Crear un balanceador de cargas de red de transferencia interna, ingresa la siguiente información:

  • En Nombre del balanceador de cargas, ingresa service-lb.
  • En Región, selecciona la misma región que tus VMs.
  • En Red, selecciona service-network.

Configura los backends

  1. Haz clic en Configuración de backend.
  2. En la lista Verificación de estado, haz clic en Crear una verificación de estado y, luego, ingresa la siguiente información:
    • En Nombre, ingresa hc-http-80.
    • En Protocolo, selecciona HTTP.
    • En Puerto, ingresa 80.
    • En Protocolo de proxy, selecciona NONE.
    • En Ruta de la solicitud, ingresa /.
  3. Haz clic en Crear.
  4. En la sección Backend nuevo de Backends, selecciona IPv4 (pila única).
  5. En Grupo de instancias, elige el grupo de instancias ig-1 y haz clic en Listo.
  6. Verifica que haya una marca de verificación azul junto a Configuración de backend antes de continuar.

Configura el frontend

  1. Haz clic en Configuración de frontend.
  2. En la sección IP y puerto de frontend nuevos, haz lo siguiente:
    1. En Nombre, ingresa service-rule.
    2. En Subred, selecciona service-subnet.
    3. En la sección Propósito de la IP interna, en la lista de Direcciones IP, selecciona Crear dirección IP, ingresa la siguiente información:
      • En Nombre, ingresa service-rule-ip.
      • En Versión de IP, selecciona IPv4.
      • En Dirección IP estática, selecciona Let me choose.
      • En Dirección IP personalizada, ingresa 10.10.10.99.
    4. Haz clic en Reservar.
    5. En Puertos, selecciona Individual y, luego, en Números de puerto, ingresa 80.
    6. Haz clic en Listo.
    7. Verifica que haya una marca de verificación azul junto a Configuración de frontend antes de continuar.

Revisa la configuración

  1. Haz clic en Revisar y finalizar.
  2. Revisa la configuración del balanceador de cargas.
  3. Haz clic en Crear.

gcloud

  1. Crea una verificación de estado HTTP regional nueva para probar la conectividad HTTP a las VM en 80.

    gcloud compute health-checks create http hc-http-80 \
        --region=REGION \
        --port=80
    

    Reemplaza REGION por la misma región que las VMs de backend.

  2. Crea el servicio de backend para el tráfico HTTP:

    gcloud compute backend-services create service-lb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=REGION \
        --health-checks=hc-http-80 \
        --health-checks-region=REGION
    

    Reemplaza REGION por la misma región que las VMs de backend.

  3. Agrega el grupo de instancias al servicio de backend:

    gcloud compute backend-services add-backend service-lb \
        --region=REGION \
        --instance-group=ig-1 \
        --instance-group-zone=ZONE
    

    Reemplaza lo siguiente:

    • REGION: La misma región que las VMs de backend.
    • ZONE: La misma zona que las VMs de backend.
  4. Crea una regla de reenvío para el servicio de backend:

    gcloud compute forwarding-rules create service-rule \
        --region=REGION \
        --load-balancing-scheme=internal \
        --network=service-network \
        --subnet=service-subnet \
        --address=10.10.10.99 \
        --ip-protocol=TCP \
        --ports=80 \
        --backend-service=service-lb \
        --backend-service-region=REGION
    

    Reemplaza REGION por la misma región que las VMs de backend.

Prueba el acceso al balanceador de cargas

Para probar que el balanceador de cargas funciona, crea una VM de prueba y envíale una solicitud.

Crea una VM de cliente para realizar pruebas

Crea una VM de cliente en la misma región que las VMs de backend (servidor).

Console

  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. En Nombre, ingresa producer-test.

  4. En Región, selecciona la misma región que las VMs de backend.

  5. En Zona, selecciona una zona de esa región.

  6. Haz clic en Herramientas de redes y configura los siguientes campos:

    1. En Etiquetas de red, ingresa allow-ssh.
    2. En Interfaces de red, selecciona lo siguiente:
      • En Red, selecciona service-network.
      • En Subred, selecciona service-subnet.
  7. Haz clic en Crear.

gcloud

gcloud compute instances create producer-test \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=service-subnet

Reemplaza ZONE por una zona que se encuentre en la misma región que las VMs de backend.

Prueba la conectividad

En esta prueba, se contacta al balanceador de cargas desde una VM de cliente. El comportamiento esperado es que el tráfico se distribuya entre las VMs de backend del balanceador de cargas.

  1. Conéctate a la instancia de VM de cliente.
    gcloud compute ssh producer-test --zone=ZONE
    
    Reemplaza ZONE por la zona de la VM del cliente.
  2. Realiza una solicitud web al balanceador de cargas mediante curl para establecer contacto con su dirección IP. Repite la solicitud para que puedas ver que las respuestas provienen de diferentes VM de backend. El nombre de la VM que genera la respuesta se muestra en el texto de la respuesta HTML, debido al contenido de /var/www/html/index.html en cada VM de backend. Por ejemplo, las respuestas esperadas tienen el aspecto Page served from: vm-1 y Page served from: vm-2.
    curl -s http://10.10.10.99
    

¿Qué sigue?