Configura un balanceador de cargas de aplicaciones interno regional con Cloud Run

En este documento, se muestra cómo implementar un balanceador de cargas de aplicaciones interno regional con Cloud Run. Para configurar esto, debes usar un backend de NEG sin servidores para el balanceador de cargas.

Antes de probar este procedimiento, asegúrate de estar familiarizado con los siguientes temas:

Los NEG sin servidores te permiten usar los servicios de Cloud Run con tu balanceador de cargas. Después de configurar un balanceador de cargas con el backend de NEG sin servidores, las solicitudes al balanceador de cargas se enrutan al backend de Cloud Run.

Antes de comenzar

  1. Instala Google Cloud CLI.
  2. Implementa un servicio de Cloud Run
  3. Configura permisos.

Instala el SDK de Google Cloud

Instala la herramienta de Google Cloud CLI. Consulta la descripción general de gcloud para obtener información conceptual y de instalación sobre la herramienta.

Si no has ejecutado la CLI de gcloud antes, ejecuta primero gcloud init para inicializar tu directorio de gcloud.

Nota: No puedes usar la consola de Google Cloud para configurar un balanceador de cargas de aplicaciones interno con un backend de NEG sin servidores.

Implementa un servicio de Cloud Run

En las instrucciones de esta página, se da por sentado que ya tienes un servicio de Cloud Run en ejecución.

En el ejemplo de esta página, puedes usar cualquiera de las guías de inicio rápido de Cloud Run para implementar un servicio de Cloud Run.

El NEG sin servidores, el balanceador de cargas y las VM de cliente deben estar en la misma región que el servicio de Cloud Run.

Para evitar el acceso al servicio de Cloud Run desde Internet, restringe la entrada a internal. El tráfico desde el balanceador de cargas de aplicaciones interno se considera tráfico interno.

gcloud run deploy CLOUD_RUN_SERVICE_NAME \
  --platform=managed \
  --allow-unauthenticated \
  --ingress=internal \
  --region=REGION \
  --image=IMAGE_URL

Toma nota del nombre del servicio que crees. En el resto de esta página, se muestra cómo configurar un balanceador de cargas que enrute las solicitudes a este servicio.

Configura permisos

Para seguir esta guía, debes crear un NEG sin servidores y un balanceador de cargas en un proyecto. Debes ser propietario o editor de un proyecto o tener las siguientes funciones de IAM de Compute Engine:

Tarea Función requerida
Crear balanceador de cargas y componentes de herramientas de redes Administrador de redes
Crear y modificar los NEG Administrador de instancias de procesamiento
Crear y modificar certificados SSL Administrador de seguridad

Configura la red y las subredes

Para configurar la red y sus subredes, realizarás las siguientes tareas:

  • Crear una red y una subred de VPC
  • Crear una subred de solo proxy

Crea la red de VPC

Crea una red de VPC en modo personalizado y, luego, las subredes que deseas dentro de una región.

Console

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

    Ir a las redes de VPC

  2. Haz clic en Crear red de VPC.

  3. En Nombre, ingresa lb-network.

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

  5. En la sección Subred nueva, especifica los siguientes parámetros de configuración para una subred:

    1. En Nombre, ingresa lb-subnet.
    2. Selecciona una Región.
    3. En Rango de direcciones IP, ingresa 10.1.2.0/24.
    4. Haz clic en Listo.
  6. Haz clic en Crear.

gcloud

  1. Crea la red de VPC personalizada con el comando gcloud compute networks create:

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. Crea una subred en la red lb-network. En este ejemplo, se usa un rango de direcciones IP de 10.1.2.0/24 para la subred. Puedes configurar cualquier rango de subred válido.

    gcloud compute networks subnets create lb-subnet \
    --network=lb-network \
    --range=10.1.2.0/24 \
    --region=REGION
    

Crea una subred de solo proxy

Crea una subred de solo proxy para todos los balanceadores de cargas basados en Envoy regionales en una región específica de la red lb-network.

Console

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

    Ir a las redes de VPC

  2. Haz clic en el nombre de la red de VPC compartida a la que deseas agregar una subred de solo proxy.

  3. Haz clic en Agregar subred.

  4. En el campo Nombre, ingresa proxy-only-subnet.

  5. Selecciona una Región.

  6. Configura Propósito como Proxy administrado regional.

  7. Ingresa un rango de direcciones IP como 10.129.0.0/23.

  8. Haga clic en Agregar.

gcloud

  1. Crea la subred de solo proxy con el comando gcloud compute networks subnets create.

    En este ejemplo, se usa un rango de direcciones IP de 10.129.0.0/23 para la subred de solo proxy. Puedes configurar cualquier rango de subred válido.

    gcloud compute networks subnets create proxy-only-subnet \
     --purpose=REGIONAL_MANAGED_PROXY \
     --role=ACTIVE \
     --region=REGION \
     --network=lb-network \
     --range=10.129.0.0/23
    

Crea el balanceador de cargas

En el siguiente diagrama, el balanceador de cargas usa un backend de NEG sin servidores para dirigir las solicitudes a un servicio de Cloud Run sin servidores.

Arquitectura de balanceo de cargas HTTP(S) interno para una aplicación de Cloud Run.
Arquitectura de balanceo de cargas HTTP(S) interno para una aplicación de Cloud Run.

El tráfico que va desde el balanceador de cargas hasta los backends de NEG sin servidores usa rutas especiales definidas fuera de la VPC que no están sujetas a las reglas de firewall. Por lo tanto, si tu balanceador de cargas solo tiene backends de NEG sin servidores, no necesitas crear reglas de firewall para permitir el tráfico desde la subred de solo proxy al backend sin servidores.

Console

Inicia la 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 aplicaciones (HTTP/HTTPS) y haz clic en Siguiente.
  4. En Orientado al público o interno, selecciona Interno y haz clic en Siguiente.
  5. En Implementación entre regiones o de una sola región, selecciona Ideal para cargas de trabajo regionales y haz clic en Siguiente.
  6. Haz clic en Configurar.

Configuración básica

  1. Para el Nombre del balanceador de cargas, ingresa serverless-lb.
  2. Selecciona la Red como lb_network.
  3. Mantén la ventana abierta para continuar.

Configure el frontend

  1. Antes de continuar, asegúrate de tener un certificado SSL.
  2. Haz clic en Configuración de frontend.
  3. Ingresa un Nombre.
  4. Para configurar un balanceador de cargas de aplicaciones interno, completa los campos como se muestra a continuación.
    1. En Protocolo, selecciona HTTPS.
    2. En Subred, selecciona la subred.
    3. En Versión de la IP, selecciona IPv4.
    4. En Dirección IP, selecciona Efímera.
    5. En Puerto, selecciona 443.
    6. En Certificado, selecciona un certificado SSL existente o crea uno nuevo.

      En el siguiente ejemplo, se muestra cómo crear certificados SSL de Compute Engine:

    7. Haz clic en Crear un certificado nuevo.
      1. En el campo Nombre, ingresa un nombre.
      2. En los campos correspondientes, sube los archivos con formato PEM:
        • Certificado
        • Clave privada
      3. Haz clic en Crear.

    Si quieres probar este proceso sin configurar un recurso de certificado SSL, puedes configurar un balanceador de cargas de HTTP.

  5. Opcional: Para crear un balanceador de cargas HTTP, haz lo siguiente:
    1. En Protocolo, selecciona HTTP.
    2. En Subred, selecciona la subred.
    3. En Versión de la IP, selecciona IPv4.
    4. En Dirección IP, selecciona Efímera.
    5. En Puerto, selecciona 80.
  6. Haga clic en Listo.

Configura los servicios de backend

  1. Haga clic en Configuración de backend.
  2. En el menú desplegable Crear o seleccionar servicios de backend, mantén el puntero sobre Servicios de backend y, luego, selecciona Crear un servicio de backend.
  3. En la ventana Crear un servicio de backend, ingresa un Nombre.
  4. En Tipo de backend, selecciona Grupo de extremos de red sin servidores.
  5. Deja Protocolo sin modificar. Este parámetro se ignora.
  6. En Backends > Nuevo backend, selecciona Crear grupo de extremos de red sin servidores.
    1. En la ventana Crear grupo de extremos de red sin servidores, ingresa un Nombre.
    2. En Región, se muestra la región del balanceador de cargas.
    3. En el campo Tipo de grupo de extremos de red sin servidores, selecciona Cloud Run. Cloud Run es el único tipo compatible.
    4. Elige Seleccionar nombre de servicio.
    5. En la lista desplegable Servicio, selecciona el servicio de Cloud Run para el que quieres crear un balanceador de cargas.
    6. Haga clic en Listo.
    7. Haga clic en Crear.
  7. En la ventana Crear servicio de backend, haz clic en Crear.

Configura reglas de enrutamiento

Las reglas de enrutamiento determinan cómo se dirige el tráfico. Puedes dirigir el tráfico a un servicio de backend o a uno de Kubernetes. El tráfico que no coincide de forma explícita con un host y un comparador de rutas se envía al servicio predeterminado.

  1. Haz clic en Regla sencilla de host y ruta de acceso.
  2. Selecciona un servicio de backend de la lista desplegable Backend.

Revisa la configuración

  1. Haz clic en Revisar y finalizar.
  2. Revisa los valores de Backend, Reglas de host y ruta de acceso y Frontend.
  3. Opcional: Haz clic en Código equivalente a fin de ver la solicitud a la API de REST que se usará para crear el balanceador de cargas.
  4. Haz clic en Crear. Espera a que se cree el balanceador de cargas.
  5. Haz clic en el nombre del balanceador de cargas (serverless-lb).
  6. Anote la dirección IP del balanceador de cargas para la siguiente tarea.

gcloud

  1. Crea un NEG sin servidores para tu servicio de Cloud Run:
        gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
            --region=REGION \
            --network-endpoint-type=serverless  \
            --cloud-run-service=CLOUD_RUN_SERVICE_NAME
        
  2. Crea un servicio de backend regional. Configura --protocol como HTTP. Este parámetro se ignora, pero es obligatorio porque --protocol se configura de manera predeterminada en TCP.
        gcloud compute backend-services create BACKEND_SERVICE_NAME \
            --load-balancing-scheme=INTERNAL_MANAGED \
            --protocol=HTTP \
            --region=REGION
        
  3. Agrega el NEG sin servidores como un backend al servicio de backend:
        gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
            --region=REGION \
            --network-endpoint-group=SERVERLESS_NEG_NAME \
            --network-endpoint-group-region=REGION
        
  4. Crea un mapa de URL regional para enrutar las solicitudes entrantes al servicio de backend:
        gcloud compute url-maps create URL_MAP_NAME \
            --default-service=BACKEND_SERVICE_NAME \
            --region=REGION
        
    Este mapa de URL de ejemplo solo se orienta a un servicio de backend que representa una sola app sin servidores, por lo que no necesitas configurar reglas de host ni comparadores de rutas de acceso.
  5. Opcional: Realiza este paso si usas HTTPS entre el cliente y el balanceador de cargas. Este paso no es obligatorio para los balanceadores de cargas HTTP.

    Puedes crear certificados de Compute Engine o del Administrador de certificados. Usa cualquiera de los siguientes métodos para crear certificados con el Administrador de certificados:

    • Certificados autoadministrados regionales Para obtener más información sobre cómo crear y usar certificados autoadministrados regionales, consulta Implementa un certificado autoadministrado regional. No se admiten mapas de certificados.

    • Certificados regionales administrados por Google. No se admiten mapas de certificados.

      El Administrador de certificados admite los siguientes tipos de certificados regionales administrados por Google:

    • Después de crear certificados, adjunta el certificado directamente al proxy de destino.

      Si deseas crear un recurso de certificado SSL autoadministrado regional:
          gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
              --certificate CRT_FILE_PATH \
              --private-key KEY_FILE_PATH \
              --region=REGION
          
    • Crea un proxy de destino regional para enrutar las solicitudes al mapa de URL.

      Para un balanceador de cargas de HTTP, crea un proxy HTTP de destino:
          gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
              --url-map=URL_MAP_NAME \
              --region=REGION
          
      Para un balanceador de cargas de HTTPS, crea un proxy HTTPS de destino. El proxy es la parte del balanceador de cargas que contiene el certificado SSL para el balanceo de cargas HTTPS, por lo que también debes cargar el certificado en este paso.
          gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
              --ssl-certificates=SSL_CERTIFICATE_NAME \
              --url-map=URL_MAP_NAME \
              --region=REGION
          
    • Crea una regla de reenvío para enrutar las solicitudes entrantes al proxy. No uses la subred de solo proxy para la dirección IP de la regla de reenvío. Puedes configurar cualquier dirección IP válida de la subred (lb-subnet).

      Para un balanceador de cargas de HTTP, ingresa el siguiente comando:
          gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
              --load-balancing-scheme=INTERNAL_MANAGED \
              --network=lb-network \
              --subnet=lb-subnet \
              --address=IP_ADDRESS \
              --target-http-proxy=TARGET_HTTP_PROXY_NAME \
              --target-http-proxy-region=REGION \
              --region=REGION \
              --ports=80
          
      Para un balanceador de cargas de HTTPS:
          gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
              --load-balancing-scheme=INTERNAL_MANAGED \
              --network=lb-network \
              --subnet=lb-subnet \
              --address=IP_ADDRESS \
              --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
              --target-https-proxy-region=REGION \
              --region=REGION \
              --ports=443
          

Prueba el balanceador de cargas

Ahora que ya configuraste el balanceador de cargas, puedes comenzar a enviar tráfico a la dirección IP del balanceador de cargas.

Crea una VM de cliente

En este ejemplo, se crea una VM de cliente (vm-client) en la misma región que el balanceador de cargas. El cliente se usa para validar la configuración del balanceador de cargas y demostrar el comportamiento esperado.

gcloud

La VM de cliente puede estar en cualquier zona de la misma REGION que el balanceador de cargas y puede usar cualquier subred de la misma red de VPC.

gcloud compute instances create vm-client \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --network=lb-network \
    --subnet=lb-subnet \
    --zone=ZONE

Cómo configurar la regla de firewall

En este ejemplo, se requiere la siguiente regla de firewall para la VM de cliente de prueba:

fw-allow-ssh. Es una regla de entrada, aplicable a la VM de cliente de prueba, que permite la conectividad SSH entrante en el puerto TCP 22 desde cualquier dirección. Puedes elegir un rango de direcciones IP de origen más restrictivo para esta regla; por ejemplo, puedes especificar solo los rangos de direcciones IP del sistema desde el que inicias sesiones SSH. En este ejemplo, se usa la etiqueta de destino allow-ssh.

Console

  1. En la consola de Google Cloud, ve a la página Firewall.
    Ir a Políticas de firewall
  2. Haz clic en Crear regla de firewall para crear la regla que permite conexiones SSH entrantes:
    • Nombre: allow-ssh
    • Red: lb-network
    • Dirección del tráfico: Entrada
    • Acción en caso de coincidencia: Permitir
    • Destinos: Etiquetas de destino especificadas
    • Etiquetas de destino: allow-ssh
    • Filtro de fuente: Rangos de IPv4
    • Rangos de IPv4 de origen: 0.0.0.0/0
    • Protocolos y puertos:
      • Elige Protocolos y puertos especificados.
      • Selecciona la casilla de verificación TCP y, luego, ingresa 22 para el número de puerto.
  3. Haz clic en Crear.

gcloud

  1. Crea la regla de firewall fw-allow-ssh para permitir la conectividad SSH a las VM con la etiqueta de red allow-ssh. Cuando omites source-ranges, Google Cloud interpreta que la regla significa cualquier fuente.

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

Envía tráfico al balanceador de cargas

Es posible que la configuración del balanceador de cargas tarde unos minutos en propagarse a nivel global después de implementarla por primera vez.

  • Conéctate mediante SSH a la instancia de cliente.

    gcloud compute ssh vm-client \
      --zone=ZONE
    
  • Verifica que el balanceador de cargas entregue la página principal del servicio de Cloud Run como se esperaba.

    Para las pruebas de HTTP, ejecuta este comando:

    curl IP_ADDRESS
    

    Para las pruebas de HTTPS, ejecuta lo siguiente:

    curl -k -s 'https://TEST_DOMAIN_URL:443' --connect-to TEST_DOMAIN_URL:443:IP_ADDRESS:443
    

    Reemplaza TEST_DOMAIN_URL por el dominio asociado a tu aplicación. Por ejemplo, test.example.com

    La marca -k hace que curl omita la validación del certificado.

Opciones de configuración adicionales

En esta sección se expande el ejemplo de configuración para proporcionar opciones de configuración alternativas y adicionales. Todas las tareas son opcionales. Puedes realizarlas en cualquier orden.

Usa una máscara para URL

Cuando creas un NEG sin servidores, en lugar de seleccionar un servicio específico de Cloud Run, puedes usar una máscara de URL para apuntar a múltiples servicios que entregan en el mismo dominio. Una máscara de URL es una plantilla del esquema de URL. El NEG sin servidores usa esta plantilla para extraer el nombre del servicio de la URL de la solicitud entrante y asignar la solicitud al servicio correspondiente.

Las máscaras de URL son útiles sobre todo si tu servicio se mapea a un dominio personalizado en lugar de mapearse a la dirección predeterminada que proporciona Google Cloud para el servicio implementado. Una máscara de URL te permite orientar varios servicios y versiones con una regla única, incluso cuando tu aplicación usa un patrón de URL personalizado.

Si aún no lo hiciste, asegúrate de leer la Descripción general de NEG sin servidores: Máscaras de URL.

Crea una máscara para URL

A fin de crear una máscara de URL para tu balanceador de cargas, comienza con la URL de tu servicio. En este ejemplo, se usa una app sin servidores de muestra que se ejecuta en https://example.com/login. Esta es la URL en la que se entrega el servicio login de la app.

  1. Quita http o https de la URL. Quedará example.com/login.
  2. Reemplaza el nombre del servicio por un marcador de posición para la máscara de URL.
    • Cloud Run: reemplaza el nombre del servicio de Cloud Run por el marcador de posición <service>. Si el servicio de Cloud Run tiene una etiqueta asociada, reemplaza el nombre de la etiqueta por el marcador de posición <tag>. En este ejemplo la máscara de URL que queda es example.com/<service>.
  3. Opcional: Si el nombre del servicio se puede extraer de la porción de la ruta de la URL, se puede omitir el dominio. La porción de la ruta de acceso de la máscara de URL se distingue por el primer carácter de barra oblicua (/). Si la barra oblicua (/) no está presente en la máscara de URL, se entiende que la máscara solo representa al host. Por lo tanto, para este ejemplo, la máscara de URL se puede reducir a /<service>.

    De manera similar, si el <service> se puede extraer de la parte del host de la URL, puedes omitir la ruta de acceso por completo de la máscara de URL.

    También puedes omitir cualquier componente de host o subdominio que aparezca antes del primer marcador de posición, y cualquier componente de la ruta de acceso que aparezca después del último marcador de posición. En esos casos, el marcador de posición captura la información requerida del componente.

Los siguientes son algunos otros ejemplos en los que se demuestran estas reglas:

En esta tabla, se supone que tienes un dominio personalizado llamado example.com y que todos tus servicios de Cloud Run se mapean a este dominio.

Servicio, nombre de la etiqueta URL de dominio personalizado de Cloud Run Máscara de URL
servicio: login https://login-home.example.com/web <service>-home.example.com
servicio: login https://example.com/login/web example.com/<service> o /<service>
servicio: login, etiqueta: test https://test.login.example.com/web <tag>.<service>.example.com
servicio: login, etiqueta: test https://example.com/home/login/test example.com/home/<service>/<tag> o /home/<service>/<tag>
servicio: login, etiqueta: test https://test.example.com/home/login/web <tag>.example.com/home/<service>

Crea un NEG sin servidores con una máscara de URL

Console

Para un balanceador de cargas nuevo, puedes usar el mismo proceso de extremo a extremo como se describió antes en este documento. Cuando configures el servicio de backend, en lugar de seleccionar un servicio específico, ingresa una máscara de URL.

Si tienes un balanceador de cargas existente, puedes editar la configuración del backend y hacer que el NEG sin servidores apunte a una máscara de URL en lugar de a un servicio específico.

Sigue estos pasos para agregar un NEG sin servidores basado en máscaras de URL a un servicio de backend existente:

  1. En la consola de Google Cloud, ve a la página Balanceo de cargas.
    Ir a Balanceo de cargas
  2. Haz clic en el nombre del balanceador de cargas que tiene el servicio de backend que deseas editar.
  3. En la página Detalles del balanceador de cargas, haz clic en Editar.
  4. En la página Editar balanceador de cargas de aplicaciones externo global, haz clic en Configuración de backend.
  5. En la página Configuración de backend, haz clic en Editar en el servicio de backend que deseas modificar.
  6. Haz clic en Agregar backend.
  7. Selecciona Crear grupo de extremos de red sin servidores.
    1. En Nombre, ingresa helloworld-serverless-neg.
    2. En Región, se muestra la región del balanceador de cargas.
    3. En Tipo de grupo de extremos de red sin servidores, Cloud Run es el único tipo de grupo de extremos de red compatible.
      1. Selecciona Usar máscara de URL.
      2. Ingresa una máscara de URL. Para obtener información sobre cómo crear una máscara de URL, consulta Crea una máscara de URL.
      3. Haz clic en Crear.

  8. En el Backend nuevo, haz clic en Listo.
  9. Haga clic en Update.

gcloud

Para crear un NEG sin servidores con una máscara de URL de muestra de example.com/<service>, ejecuta el siguiente comando:

gcloud compute network-endpoint-groups create SERVERLESS_NEG_MASK_NAME \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-url-mask="example.com/<service>"

Borra un NEG sin servidores

Si un grupo de extremos de red está vinculado a un servicio de backend, no se puede quitar. Antes de borrar un NEG, asegúrate de que esté desvinculado del servicio de backend.

Console

  1. Para asegurarte de que el NEG sin servidores que desees borrar no esté en uso por parte de algún servicio de backend, ve a la pestaña Servicios de backend en la página Componentes de balanceo de cargas.
    Ir a Servicios de backend
  2. Si el NEG sin servidores está en uso, haz lo siguiente:
    1. Haz clic en el nombre del servicio de backend que usa el NEG sin servidores.
    2. Haz clic en Editar.
    3. En la lista de Backends, haz clic en para quitar el backend de NEG sin servidores del servicio de backend.
    4. Haz clic en Guardar.

  3. Ve a la página Grupo de extremos de red en la consola de Google Cloud.
    Ir al grupo de extremos de red
  4. Selecciona la casilla de verificación del NEG sin servidores que quieres borrar.
  5. Haz clic en Borrar.
  6. Haz clic en Borrar nuevamente para confirmar.

gcloud

Para quitar un NEG sin servidores de un servicio de backend, debes especificar la región en la que se creó el NEG.

gcloud compute backend-services remove-backend BACKEND_SERVICE_NAME \
    --network-endpoint-group=SERVERLESS_NEG_NAME \
    --network-endpoint-group-region=REGION \
    --region=REGION

Para borrar el NEG sin servidores, haz lo siguiente:

gcloud compute network-endpoint-groups delete SERVERLESS_NEG_NAME \
    --region=REGION

¿Qué sigue?