Entrega tráfico desde varias regiones

Para mostrar respuestas más rápidas a los usuarios de todo el mundo, debes implementar servicios en varias regiones y enrutar a tus usuarios a la región más cercana. La implementación en varias regiones ofrece baja latencia y mayor disponibilidad en caso de interrupciones regionales.

Debido a que los servicios de Cloud Run se implementan en regiones individuales, debes implementar tu servicio en varias regiones y, luego, configurar el balanceo de cargas global para el servicio.

Puedes automatizar la conmutación por error entre regiones con el estado del servicio de Cloud Run.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, 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.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, 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.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Configura tu entorno de desarrollo de Cloud Run en tu Google Cloud proyecto.
  7. Instala y, luego, inicializa gcloud CLI.
  8. Asegúrate de que tu cuenta tenga los siguientes roles de IAM:
  9. Otorga los roles

    Console

    1. En la consola de Google Cloud , dirígete a la página IAM.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Otorgar acceso.
    4. En el campo Principales nuevas, ingresa tu identificador de usuario. Por lo general, esta es la dirección de correo electrónico de la Cuenta de Google que se usa para implementar el servicio de Cloud Run.

    5. En la lista Seleccionar un rol, elige uno.
    6. Para otorgar roles adicionales, haz clic en Agregar otro rol y selecciona cada rol adicional.
    7. Haz clic en Guardar.

    gcloud

    Para otorgar los roles de IAM necesarios a tu cuenta en tu proyecto, sigue estos pasos:

            gcloud projects add-iam-policy-binding PROJECT_ID \
                --member=PRINCIPAL \
                --role=ROLE
            

    Reemplaza lo siguiente:

    • PROJECT_NUMBER por el número de tu proyecto Google Cloud .
    • PROJECT_ID por el ID de tu proyecto Google Cloud .
    • PRINCIPAL por la cuenta a la que agregarás la vinculación. Por lo general, esta es la dirección de correo electrónico de la Cuenta de Google que se usa para implementar el servicio de Cloud Run.
    • ROLE con el rol que agregas a la cuenta del implementador.
  10. Revisa la página de precios de Cloud Run. Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
  11. Ejecuta el siguiente comando para habilitar las APIs de Artifact Registry, Cloud Build, API de Cloud Run Admin, Compute Engine y Network Services API:
  12.   gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        compute.googleapis.com \
        networkservices.googleapis.com
      

    Implementa el servicio en varias regiones

    Los parámetros de ajuste de escala que configures se aplicarán en varias regiones. En una implementación multirregional, por ejemplo, el valor de instancias mínimas se aplica a cada una de las múltiples regiones.

    Implementas el mismo servicio en varias regiones con uno de los siguientes métodos:

    Implementa un servicio multirregional

    En esta sección, se muestra cómo implementar y configurar un servicio multirregional con un solo comando de gcloud CLI o con un archivo YAML o Terraform.

    gcloud

    • Para crear e implementar un servicio multirregional, ejecuta el comando gcloud run deploy con la marca --regions:

      gcloud run deploy SERVICE_NAME \
        --image=IMAGE_URL \
        --regions=REGIONS

      Reemplaza lo siguiente:

      • SERVICE_NAME: Es el nombre del servicio multirregional que deseas implementar.
      • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest.
      • REGIONS: Es la lista de varias regiones en las que deseas realizar la implementación. Por ejemplo, europe-west1,asia-east1

    YAML

    1. Crea el archivo YAML para tu servicio con el atributo run.googleapis.com/regions para establecer las múltiples regiones en las que deseas implementar tu servicio:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: SERVICE_NAME
        annotations:
          run.googleapis.com/regions: REGIONS
      spec:
        template:
          spec:
            containers:
            - image: IMAGE_URL

      Reemplaza lo siguiente:

      • SERVICE_NAME: Es el nombre del servicio multirregional en el que deseas realizar la implementación.
      • REGIONS: Es la lista de las múltiples regiones que deseas actualizar. Por ejemplo, europe-west1,asia-east1
      • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest.
    2. Crea el servicio con el siguiente comando:

      gcloud run multi-region-services replace service.yaml

    Terraform

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    Agrega lo siguiente a un recurso google_cloud_run_v2_service en tu configuración de Terraform.

    resource "google_cloud_run_v2_service" "default" {
      name     = "cloudrun-service-multi-region"
      regions = [
        "REGION_1",
        "REGION_2",
      ]
    
    template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    }
    }
    

    Reemplaza "REGION_1" y "REGION_2" por cada una de las regionesGoogle Cloud necesarias. Por ejemplo, europe-west1 y us-central1.

    Actualiza un servicio multirregional

    En esta sección, se muestra cómo agregar o quitar regiones de un servicio multirregional con un solo comando de gcloud CLI o un archivo YAML.

    gcloud

    Para agregar o quitar regiones de un servicio multirregional, ejecuta el comando gcloud run multi-region-services update.

    • Para agregar el servicio multirregional a una o más regiones adicionales, usa la marca --add-regions:

      gcloud run multi-region-services update SERVICE_NAME \
        --add-regions=REGIONS
    • Para quitar el servicio multirregional de una o más regiones, usa la marca --remove-regions:

      gcloud run multi-region-services update SERVICE_NAME \
        --remove-regions=REGIONS

      Reemplaza lo siguiente:

      • SERVICE_NAME: Es el nombre del servicio multirregional que deseas actualizar.
      • REGIONS: Regiones en las que deseas agregar o quitar tu servicio. Por ejemplo, us-central1,asia-east1

    YAML

    1. Para actualizar un servicio multirregional existente, descarga su configuración de YAML:

      gcloud run multi-region-services describe SERVICE_NAME --format export > service.yaml
    2. Actualiza el atributo run.googleapis.com/regions para agregar o quitar la lista de regiones en las que deseas que se implemente el servicio:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: SERVICE_NAME
        annotations:
          run.googleapis.com/regions: REGIONS

      Reemplaza lo siguiente:

      • SERVICE_NAME: Es el nombre del servicio multirregional en el que deseas realizar la implementación.
      • REGIONS: Es la nueva lista de varias regiones en las que deseas que se implemente la revisión del servicio.
    3. Actualiza el servicio con el siguiente comando:

      gcloud run multi-region-services replace service.yaml

    Borra un servicio multirregional

    • Para borrar un servicio multirregional, ejecuta el comando gcloud run multi-region-services delete:

      gcloud run multi-region-services delete SERVICE_NAME

      Reemplaza SERVICE_NAME por el nombre del servicio multirregional que deseas borrar.

    Configura un balanceador de cargas de aplicaciones externo global

    En esta sección, se muestra cómo configurar un balanceador de cargas de aplicaciones externo global con un dominio protegido con un certificado TLS administrado que apunte a una dirección IP anycast global, que enruta a los usuarios al centro de datos de Google más cercano que implementa tu servicio.

    La arquitectura que se describe en las siguientes secciones no enruta las solicitudes de forma automática a una región diferente cuando un servicio regional de Cloud Run deja de responder o muestra errores.

    Para aumentar la disponibilidad de tu servicio multirregional, haz lo siguiente:

    Crea un balanceador de cargas de aplicaciones externo global

    Crear un balanceador de cargas de aplicaciones externo global implica crear varios recursos de red y conectarlos:

    gcloud

    1. Reserva una dirección IP estática para que no tengas que actualizar los registros DNS cuando vuelves a crear el balanceador de cargas.
      gcloud compute addresses create --global SERVICE_IP
      En el comando anterior, reemplaza SERVICE_IP por un nombre para el recurso de dirección IP (p. ej., myservice-ip).

      Esta dirección IP es una dirección IPv4 anycast global que se enruta al centro de datos de Google o al punto de presencia más cercano a los visitantes.

    2. Crea un servicio de backend.
      gcloud compute backend-services create \
        --global BACKEND_NAME \
        --load-balancing-scheme=EXTERNAL_MANAGED

      Reemplaza BACKEND_NAME por el nombre que deseas darle al servicio de backend. Por ejemplo, myservice-backend

    3. Crea un mapa de URL.
      gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

      Reemplaza URLMAP_NAME por el nombre que deseas asignar al mapa de URL (p. ej., myservice-urlmap).

    4. Crea un certificado TLS administrado para que el dominio entregue tráfico de HTTPS. Reemplaza example.com por el nombre de dominio.
      gcloud compute ssl-certificates create CERT_NAME \
        --domains=example.com

      Reemplaza CERT_NAME por el nombre que quieres que tenga el certificado SSL administrado (p. ej., myservice-cert).

    5. Crea un proxy HTTPS de destino.
      gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
        --ssl-certificates=CERT_NAME \
        --url-map=URLMAP_NAME

      Reemplaza HTTPS_PROXY_NAME por el nombre que deseas otorgar al proxy HTTPS de destino (p. ej., myservice-https).

    6. Crea una regla de reenvío que conecte los recursos de red que creaste a la dirección IP.
      gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
        --target-https-proxy=HTTPS_PROXY_NAME \
        --address=SERVICE_IP \
        --ports=443 \
        --load-balancing-scheme=EXTERNAL_MANAGED 

      Reemplaza FORWARDING_RULE_NAME por el nombre del recurso de regla de reenvío que deseas crear. Por ejemplo, myservice-lb

    Terraform

    Como alternativa a los pasos descritos en esta sección, puedes usar el Módulo de Terraform del balanceador de cargas de HTTP global.

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    1. Configura la dirección IP:

      resource "google_compute_global_address" "lb_default" {
        provider = google-beta
        name     = "myservice-service-ip"
      
        # Use an explicit depends_on clause to wait until API is enabled
        depends_on = [
          google_project_service.compute_api
        ]
      }
      output "load_balancer_ip_addr" {
        value = google_compute_global_address.lb_default.address
      }

      Configura el nombre del recurso de dirección IP como myservice-service-ip. Puedes cambiarlo a tu propio valor. Esta dirección IP es una dirección IPv4 anycast global que se enruta al centro de datos de Google o al punto de presencia más cercano a los visitantes.

    2. Crea y configura el servicio de backend:

      resource "google_compute_backend_service" "lb_default" {
        provider              = google-beta
        name                  = "myservice-backend"
        load_balancing_scheme = "EXTERNAL_MANAGED"
      
        backend {
          group = google_compute_region_network_endpoint_group.lb_default[0].id
        }
      
        backend {
          group = google_compute_region_network_endpoint_group.lb_default[1].id
        }
      
        # Use an explicit depends_on clause to wait until API is enabled
        depends_on = [
          google_project_service.compute_api,
        ]
      }

      Este recurso configura el servicio de backend para que se llame myservice-backend. Puedes cambiarlo a tu propio valor.

    3. Configura el mapa de URL:

      resource "google_compute_url_map" "lb_default" {
        provider        = google-beta
        name            = "myservice-lb-urlmap"
        default_service = google_compute_backend_service.lb_default.id
      
        path_matcher {
          name            = "allpaths"
          default_service = google_compute_backend_service.lb_default.id
          route_rules {
            priority = 1
            url_redirect {
              https_redirect         = true
              redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
            }
          }
        }
      }

      Conecta el recurso de servicio de backend (myservice-backend) al nuevo recurso de mapa de URL (myservice-lb-urlmap). Puedes cambiarlos por tus propios valores.

    4. Crea un certificado TLS administrado para que el dominio entregue tráfico de HTTPS. Reemplaza example.com por tu nombre de dominio en el recurso google_compute_managed_ssl_certificate:

      resource "google_compute_managed_ssl_certificate" "lb_default" {
        provider = google-beta
        name     = "myservice-ssl-cert"
      
        managed {
          domains = ["example.com"]
        }
      }
    5. Configura el proxy HTTPS:

      resource "google_compute_target_https_proxy" "lb_default" {
        provider = google-beta
        name     = "myservice-https-proxy"
        url_map  = google_compute_url_map.lb_default.id
        ssl_certificates = [
          google_compute_managed_ssl_certificate.lb_default.name
        ]
        depends_on = [
          google_compute_managed_ssl_certificate.lb_default
        ]
      }

      Crea un recurso google_compute_target_https_proxy con el nombre de destino myservice-https-proxy y conecta el certificado TLS creado previamente (myservice-ssl-cert) y los recursos de asignación de URL (myservice-lb-urlmap). Puedes cambiarlos por tus propios valores.

    6. Configura la regla de reenvío:

      resource "google_compute_global_forwarding_rule" "lb_default" {
        provider              = google-beta
        name                  = "myservice-lb-fr"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        target                = google_compute_target_https_proxy.lb_default.id
        ip_address            = google_compute_global_address.lb_default.id
        port_range            = "443"
        depends_on            = [google_compute_target_https_proxy.lb_default]
      }

      Crea el recurso google_compute_global_forwarding_rule con el nombre de destino myservice-https-proxy y conecta el proxy HTTPS de destino (myservice-https-proxy) y el recurso de dirección IP (myservice-service-ip) que creaste anteriormente. Puedes cambiarlos a tus propios valores.

    7. Aplica esta configuración:

      Para aplicar tu configuración de Terraform en un proyecto de Google Cloud , completa los pasos de las siguientes secciones.

      Prepara Cloud Shell

      1. Inicia Cloud Shell
      2. Establece el proyecto Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

        Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

        export GOOGLE_CLOUD_PROJECT=PROJECT_ID

        Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

      Prepara el directorio

      Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

      1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
        mkdir DIRECTORY && cd DIRECTORY && touch main.tf
      2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

        Copia el código de muestra en el main.tf recién creado.

        De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

      3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
      4. Guarda los cambios.
      5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
        terraform init

        De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

        terraform init -upgrade

      Aplica los cambios

      1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
        terraform plan

        Corrige la configuración según sea necesario.

      2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
        terraform apply

        Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

      3. Abre tu proyecto Google Cloud para ver los resultados. En la consola de Google Cloud , navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

    Configura grupos de extremos de red regionales

    Para cada región que implementaste en el paso anterior, debes crear grupos de extremos de red (NEG) sin servidores y agregarlos al servicio de backend con las siguientes instrucciones:

    gcloud CLI

    1. Crea un grupo de extremos de red para el servicio de Cloud Run en REGION:

      gcloud compute network-endpoint-groups create NEG_NAME \
        --region=REGION \
        --network-endpoint-type=serverless \
        --cloud-run-service=SERVICE_NAME

      Reemplaza lo siguiente:

      • NEG_NAME por el nombre del recurso del grupo de extremos de red (por ejemplo, myservice-neg-uscentral1)
      • REGION por la región en la que se implementa el servicio
      • SERVICE_NAME por el nombre de tu servicio
    2. Agrega el grupo de extremos de red al servicio de backend:

      gcloud compute backend-services add-backend --global BACKEND_NAME \
        --network-endpoint-group-region=REGION \
        --network-endpoint-group=NEG_NAME

      Especifica el NEG_NAME que creaste en el paso anterior para la región.

    3. Repite los pasos anteriores para cada región.

    Terraform

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    1. Configura un grupo de extremos de red con el nombre myservice-neg para el servicio de Cloud Run en cada región especificada en la variable run_regions:

      resource "google_compute_region_network_endpoint_group" "lb_default" {
        provider              = google-beta
        count                 = length(local.run_regions)
        name                  = "myservice-neg"
        network_endpoint_type = "SERVERLESS"
        region                = local.run_regions[count.index]
        cloud_run {
          service = google_cloud_run_v2_service.run_default[count.index].name
        }
      }
    2. Configura un servicio de backend para conectar el grupo de extremos de red (myservice-neg):

      resource "google_compute_backend_service" "lb_default" {
        provider              = google-beta
        name                  = "myservice-backend"
        load_balancing_scheme = "EXTERNAL_MANAGED"
      
        backend {
          group = google_compute_region_network_endpoint_group.lb_default[0].id
        }
      
        backend {
          group = google_compute_region_network_endpoint_group.lb_default[1].id
        }
      
        # Use an explicit depends_on clause to wait until API is enabled
        depends_on = [
          google_project_service.compute_api,
        ]
      }

    Configura registros DNS en el dominio

    Para apuntar el nombre de dominio a la regla de reenvío que creaste, actualiza sus registros DNS con la dirección IP que creaste.

    1. Busca la dirección IP reservada del balanceador de cargas ejecutando el siguiente comando:

      gcloud compute addresses describe SERVICE_IP \
        --global \
        --format='value(address)'

      Reemplaza SERVICE_IP por el nombre de la dirección IP que creaste antes. Con este comando, se imprimirá la dirección IP en el resultado.

    2. Para actualizar los registros DNS del dominio, agrega un registro A con esta dirección IP.

    Configura un público personalizado si usas servicios autenticados

    Los servicios autenticados están protegidos por IAM. Estos servicios de Cloud Run requieren una autenticación de cliente que declare el destinatario previsto de una solicitud durante la generación de la credencial (el público).

    El público suele ser la URL completa del servicio de destino, que de forma predeterminada es una URL generada que termina en run.app para los servicios de Cloud Run. Sin embargo, en una implementación multirregional, un cliente no puede saber con anticipación a qué servicio regional se enrutará una solicitud. Por lo tanto, en el caso de una implementación multirregional, configura el servicio para que use públicos personalizados.

    Espera a que el balanceador de cargas aprovisione

    Después de configurar el dominio con la dirección IP del balanceador de cargas, espera a que se propaguen los registros DNS. Del mismo modo, espera a que se emita el certificado TLS administrado para tu dominio y esté listo para comenzar a entregar tráfico de HTTPS de manera global.

    El balanceador de cargas puede tardar hasta 30 minutos en comenzar a entregar tráfico.

    Cuando esté listo, visita la URL de tu sitio web con el prefijo https:// para probarlo.

    Verifica el estado

    1. Para verificar el estado de la propagación de los registros DNS, usa la utilidad de línea de comandos de dig:

      dig A +short example.com

      El resultado muestra la dirección IP que configuraste en tus registros DNS.

    2. Para verificar el estado de la emisión del certificado administrado, ejecuta el siguiente comando:

      gcloud compute ssl-certificates describe CERT_NAME

      Reemplaza CERT_NAME por el nombre que elegiste antes para el recurso del certificado SSL.

      El resultado muestra una línea que contiene status: ACTIVE.

    Configurar el redireccionamiento de HTTP a HTTPS

    Según la configuración predeterminada, una regla de reenvío solo controla un único protocolo y, por lo tanto, las solicitudes a los extremos http:// responden con el error "404 Not Found". Si necesitas que las solicitudes a tus URLs http:// se redireccionen al protocolo https://, crea un mapa de URL adicional y una regla de reenvío con las siguientes instrucciones:

    gcloud CLI

    1. Cree un mapa de URL con una regla de redireccionamiento.

      gcloud compute url-maps import HTTP_URLMAP_NAME \
        --global \
        --source /dev/stdin <<EOF
              name: HTTP_URLMAP_NAME
              defaultUrlRedirect:
                redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
                httpsRedirect: True
              EOF

      Reemplaza HTTP_URLMAP_NAME por el nombre del recurso de mapa de URL que crearás (por ejemplo, myservice-httpredirect).

    2. Crea un proxy HTTP de destino con el mapa de URL.

      gcloud compute target-http-proxies create HTTP_PROXY_NAME \
        --url-map=HTTP_URLMAP_NAME

      Reemplaza HTTP_PROXY_NAME por el nombre del proxy HTTP de destino que crearás (por ejemplo, myservice-http).

    3. Crea una regla de reenvío en el puerto 80 con la misma dirección IP reservada.

      gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \
        --target-http-proxy=HTTP_PROXY_NAME \
        --address=SERVICE_IP \
        --ports=80
              

      Reemplaza HTTP_FORWARDING_RULE_NAME por el nombre de la regla de reenvío nueva que crearás (por ejemplo, myservice-httplb).

    Terraform

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    1. Cree un recurso de mapa de URL con una regla de redireccionamiento.

      resource "google_compute_url_map" "https_default" {
        provider = google-beta
        name     = "myservice-https-urlmap"
      
        default_url_redirect {
          redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
          https_redirect         = true
          strip_query            = false
        }
      }
    2. Crea un proxy HTTP de destino con el recurso de asignación de URL recién creado (myservice-https-urlmap):

      resource "google_compute_target_http_proxy" "https_default" {
        provider = google-beta
        name     = "myservice-http-proxy"
        url_map  = google_compute_url_map.https_default.id
      
        depends_on = [
          google_compute_url_map.https_default
        ]
      }
    3. Crea una regla de reenvío en el puerto 80 con la misma dirección IP reservada (myservice-http-proxy).

      resource "google_compute_global_forwarding_rule" "https_default" {
        provider   = google-beta
        name       = "myservice-https-fr"
        target     = google_compute_target_http_proxy.https_default.id
        ip_address = google_compute_global_address.lb_default.id
        port_range = "80"
        depends_on = [google_compute_target_http_proxy.https_default]
      }

    Para obtener más opciones de configuración, consulta Configura un balanceador de cargas de aplicaciones externo global con Cloud Run.

    Automatiza la conmutación por error entre regiones con el estado del servicio de Cloud Run

    El estado del servicio de Cloud Run minimiza las interrupciones del servicio y automatiza la conmutación por error y la recuperación en varias regiones. Configura un servicio de Cloud Run multirregional y de alta disponibilidad con capacidades automatizadas de conmutación por error y recuperación para el tráfico interno.

    Limitaciones

    Las siguientes limitaciones se aplican al estado del servicio de Cloud Run:

    • Debes configurar al menos una instancia mínima a nivel de servicio o de revisión por región para calcular el estado. También puedes usar la métrica Cantidad de instancias de contenedor en Cloud Monitoring para estimar la cantidad mínima de instancias requeridas para tus regiones.
    • Las conmutaciones por error requieren al menos dos servicios de diferentes regiones. De lo contrario, si falla un servicio, se mostrará el mensaje de error no healthy upstream.
    • El estado del servicio de Cloud Run no admite balanceadores de cargas de aplicaciones internos entre regiones con más de 5 backends de NEG sin servidores.
    • No puedes configurar una máscara de URL ni etiquetas en los NEG sin servidores.
    • No puedes habilitar IAP desde un servicio de backend o un balanceador de cargas. Habilita IAP directamente desde Cloud Run.
    • Si se borra un servicio de Cloud Run, Cloud Run no informa un estado no saludable al balanceador de cargas.
    • El inicio de una instancia nueva no contará el primer sondeo de disponibilidad, por lo que es posible que una solicitud se enrute brevemente a un servicio recién iniciado antes de que deje de estar en buen estado.
    • El estado del servicio de Cloud Run se calcula en todas las instancias. Las revisiones sin sondeos se consideran desconocidas. El balanceador de cargas trata las instancias desconocidas como en buen estado.

    Informa el estado de la región

    Para agregar el estado de los servicios de Cloud Run regionales y registrar un estado en buen estado o en mal estado en el balanceador de cargas, sigue estos pasos:

    1. Implementa una revisión del servicio de Cloud Run en varias regiones con una o más instancias mínimas. Ejecuta el siguiente comando para usar el sondeo de preparación que configuraste en el paso anterior:

      gcloud beta run deploy SERVICE_NAME \
      --regions=REGION_A,REGION_B \
      --min=MIN_INSTANCES

      Reemplaza lo siguiente:

      • SERVICE_NAME: El nombre del servicio
      • REGION_A, REGION_B: Son las diferentes regiones para la revisión de tu servicio. Por ejemplo, configura REGION_A como us-central1 y REGION_B como europe-west1.
      • MIN_INSTANCES: Es la cantidad de instancias de contenedor que se mantendrán en espera, listas para recibir solicitudes. Debes establecer el valor mínimo en 1 o más.
    2. Configura una prueba de disponibilidad de gRPC o HTTP en cada instancia de contenedor.

    3. Configura un balanceador de cargas de aplicaciones interno entre regiones para desviar el tráfico de las regiones en mal estado.

    4. Configura NEGs sin servidores para cada servicio de Cloud Run en cada región.

    5. Configura un servicio de backend para que se conecte con NEG sin servidores.

    Prácticas recomendadas

    Puedes usar una combinación de sondeos de preparación, división del tráfico y una cantidad mínima de instancias para realizar lanzamientos graduales y seguros. Esto te permite verificar el estado de una revisión nueva en una sola región de "canario" antes de promoverla, lo que garantiza que el balanceador de cargas solo envíe tráfico a los backends regionales en buen estado.

    Puedes lanzar una revisión de servicio en un servicio de Cloud Run existente que no use un sondeo de disponibilidad ni el estado del servicio de Cloud Run. Sigue este proceso para implementar de forma segura una revisión nueva, una región a la vez:

    1. Implementa la revisión nueva en una sola región "canary" con una sonda de preparación configurada.

    2. Envía una pequeña cantidad de tráfico (por ejemplo, el 1%) a la revisión nueva.

    3. Usa instancias mínimas distintas de cero a nivel del servicio, en lugar de a nivel de la revisión.

    4. Verifica la métrica de la sonda de preparación (run.googleapis.com/container/instance_count_with_readiness) para asegurarte de que las instancias nuevas estén en buen estado.

    5. Aumenta el porcentaje de tráfico a la revisión nueva en pasos incrementales. A medida que aumentes el tráfico, supervisa la métrica de estado del servicio regional de Cloud Run (run.googleapis.com/service_health_count), que usa el balanceador de cargas. Los informes de estado del servicio de Cloud Run muestran UNKNOWN hasta que se enruta suficiente tráfico a la revisión nueva.

    6. Una vez que la revisión reciba el 100% del tráfico y el estado del servicio regional de Cloud Run sea estable y correcto, repite este proceso para todas las demás regiones.

    Supervisa las verificaciones de estado

    Después de configurar el estado del servicio de Cloud Run, los NEGs sin servidores recopilan la métrica de estado del servicio de Cloud Monitoring. Puedes ver el estado de los servicios regionales existentes. En el siguiente diagrama, se muestra cómo responden estos componentes de estado del servicio de Cloud Run a las solicitudes a tu servicio:

    Ilustración de los componentes de estado del servicio de Cloud Run

    Si un servicio en una región está en mal estado, el balanceador de cargas desvía el tráfico de la región en mal estado a una región en buen estado. El tráfico se recupera después de que la región vuelve a estar en buen estado.

    Usa suscripciones de envío de Pub/Sub autenticadas con implementación multirregional

    De forma predeterminada, un servicio de Pub/Sub entrega mensajes a los extremos de envío en la misma Google Cloud región en la que el servicio de Pub/Sub almacena los mensajes. Para obtener una solución alternativa a este comportamiento, consulta Usa una suscripción de envío de Pub/Sub autenticada con una implementación de Cloud Run multirregional.

    Configura una conmutación por error manual

    Para configurar manualmente el tráfico de modo que conmute por error a una región en buen estado, modifica el mapa de URL del balanceador de cargas de aplicaciones externo global.

    1. Para actualizar el mapa de URL del balanceador de cargas de aplicaciones externo global, quita el NEG del servicio de backend con la marca --global:

      gcloud compute backend-services remove-backend BACKEND_NAME \
      --network-endpoint-group=NEG_NAME \
      --network-endpoint-group-region=REGION \
      --global
      

      Reemplaza lo siguiente:

      • BACKEND_NAME: el nombre del servicio de backend.
      • NEG_NAME: Es el nombre del recurso del grupo de extremos de red, por ejemplo, myservice-neg-uscentral1.
      • REGION: Es la región en la que se creó el NEG y en la que deseas quitar tu servicio. Por ejemplo, us-central1,asia-east1
    2. Para confirmar que una región en buen estado ahora entrega tráfico, navega a https://<domain-name>.

    ¿Qué sigue?