Gestisci il traffico da più regioni

Restituisci risposte più rapide agli utenti di tutto il mondo eseguendo il deployment dei servizi in più regioni e indirizzando gli utenti alla regione più vicina. Il deployment in più regioni offre bassa latenza e maggiore disponibilità in caso di interruzioni a livello di regione.

Poiché i servizi Cloud Run vengono sottoposti a deployment in singole regioni, devi eseguire il deployment del servizio in più regioni e poi configurare il bilanciamento del carico globale per il servizio.

Esegui il deployment del servizio in più regioni

Puoi eseguire il deployment dello stesso servizio in più regioni utilizzando uno dei seguenti metodi:

Esegui il deployment di un servizio multiregionale

Questa sezione mostra come eseguire il deployment e configurare un servizio multiregionale da un singolo comando gcloud CLI o un file YAML.

gcloud

  • Per creare e distribuire un servizio multiregionale, esegui il comando gcloud beta run deploy utilizzando il flag --regions:

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

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del servizio multiregionale che vuoi eseguire il deployment.
    • IMAGE_URL: un riferimento all'immagine del container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest.
    • REGIONS: L'elenco delle più regioni in cui vuoi eseguire il deployment. Ad esempio, europe-west1,asia-east1.

YAML

  1. Crea il file YAML per il tuo servizio utilizzando l'attributo run.googleapis.com/regions per impostare le più regioni in cui vuoi eseguire il deployment del servizio:

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

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del servizio multiregionale a cui vuoi eseguire il deployment.
    • REGIONS: l'elenco delle più regioni che vuoi aggiornare. Ad esempio, europe-west1,asia-east1.
    • IMAGE_URL: un riferimento all'immagine del container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest.
  2. Crea il servizio utilizzando il seguente comando:

    gcloud beta run multi-region-services replace service.yaml

Aggiorna un servizio multiregionale

Questa sezione mostra come aggiungere o rimuovere regioni da un servizio multiregionale da un singolo comando gcloud CLI o da un file YAML.

gcloud

Per aggiungere o rimuovere regioni da un servizio multiregionale, esegui il comando gcloud beta run multi-region-services update.

  • Per aggiungere il servizio multiregionale a una o più regioni aggiuntive, utilizza il flag --add-regions:

    gcloud beta run multi-region-services update SERVICE_NAME \
      --add-regions=REGIONS
  • Per rimuovere il servizio multiregionale da una o più regioni, utilizza il flag --remove-regions:

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

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del servizio multiregionale che vuoi aggiornare.
    • REGIONS: la regione o le regioni a cui vuoi aggiungere o da cui vuoi rimuovere il servizio. Ad esempio, europe-west1,asia-east1.

YAML

  1. Per aggiornare un servizio multiregionale esistente, scarica la relativa configurazione YAML:

    gcloud beta run multi-region-services describe SERVICE_NAME --format export > service.yaml
  2. Aggiorna l'attributo run.googleapis.com/regions per aggiungere o rimuovere l'elenco delle regioni in cui vuoi che venga eseguito il deployment del servizio:

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

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del servizio multiregionale a cui vuoi eseguire il deployment.
    • REGIONS: Il nuovo elenco di più regioni in cui vuoi che venga eseguito il deployment della revisione del servizio.
  3. Aggiorna il servizio utilizzando il seguente comando:

    gcloud beta run multi-region-services replace service.yaml

Elimina un servizio multiregionale

  • Per eliminare un servizio multiregionale, esegui il comando gcloud beta run multi-region-services delete:

    gcloud beta run multi-region-services delete SERVICE_NAME

    Sostituisci SERVICE_NAME con il nome del servizio multiregionale che vuoi eliminare.

Configura il bilanciamento del carico globale

Questa sezione mostra come configurare un bilanciatore del carico delle applicazioni esterno con un dominio protetto da un certificato TLS gestito che punta a un indirizzo IP anycast globale, che indirizza gli utenti al data center Google più vicino che esegue il deployment del tuo servizio.

L'architettura descritta nelle sezioni seguenti non instrada automaticamente le richieste a un'altra regione quando un servizio Cloud Run regionale non risponde o restituisce errori. Per aumentare la disponibilità del tuo servizio multiregionale, puoi configurare il rilevamento di outlier per identificare i servizi Cloud Run non integri in base al tasso di errori HTTP e deviare alcune richieste verso un'altra regione.

Crea un bilanciatore del carico

La creazione di un bilanciatore del carico delle applicazioni esterno comporta la creazione di varie risorse di rete e il loro collegamento:

Interfaccia a riga di comando gcloud

  1. Prenota un indirizzo IP statico in modo da non dover aggiornare i record DNS quando ricrei il bilanciatore del carico.
    gcloud compute addresses create --global SERVICE_IP
    Nel comando precedente, sostituisci SERVICE_IP con un nome per la risorsa dell'indirizzo IP (ad es. myservice-ip).

    Questo indirizzo IP è un indirizzo IPv4 anycast globale che indirizza al data center o al punto di presenza Google più vicino ai tuoi visitatori.

  2. Crea un servizio di backend.
    gcloud compute backend-services create --global BACKEND_NAME

    Nel comando precedente, sostituisci BACKEND_NAME con un nome che vuoi assegnare al servizio di backend (ad es. myservice-backend).

  3. Crea una mappa URL.
    gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

    Sostituisci URLMAP_NAME con un nome che vuoi assegnare alla mappa URL (ad es. myservice-urlmap).

  4. Crea un certificato TLS gestito per il tuo dominio per pubblicare il traffico HTTPS. Sostituisci example.com con il nome del tuo dominio.
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=example.com

    Sostituisci CERT_NAME con il nome che vuoi assegnare al certificato SSL gestito (ad es. myservice-cert).

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

    Sostituisci HTTPS_PROXY_NAME con il nome che vuoi assegnare al proxy HTTPS di destinazione (ad es. myservice-https).

  6. Crea una regola di forwarding che colleghi le risorse di rete che hai creato all'indirizzo IP.
    gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
      --target-https-proxy=HTTPS_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=443

    Sostituisci FORWARDING_RULE_NAME con il nome della risorsa della regola di forwarding che vuoi creare (ad es. myservice-lb).

Terraform

In alternativa ai passaggi descritti in questa sezione, puoi utilizzare il modulo Terraform del bilanciatore del carico HTTP globale.

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

  1. Configura l'indirizzo 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 il nome della risorsa dell'indirizzo IP in modo che sia myservice-service-ip. Puoi modificare questo valore con il tuo. Questo indirizzo IP è un indirizzo IPv4 anycast globale che indirizza al data center o al punto di presenza Google più vicino ai tuoi visitatori.

  2. Crea e configura il servizio di 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,
      ]
    }

    Questa risorsa configura il servizio di backend in modo che venga denominato myservice-backend. Puoi modificare questo valore con il tuo.

  3. Configura la mappa 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"
          }
        }
      }
    }

    Collega la risorsa del servizio di backend (myservice-backend) alla nuova risorsa della mappa URL (myservice-lb-urlmap). Puoi modificarli con i tuoi valori.

  4. Crea un certificato TLS gestito per il tuo dominio per pubblicare il traffico HTTPS. Sostituisci example.com con il tuo nome di dominio nella risorsa 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 il 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 la risorsa google_compute_target_https_proxy con il nome di destinazione myservice-https-proxy e collega le risorse di mapping degli URL (myservice-lb-urlmap) e del certificato TLS (myservice-ssl-cert) create in precedenza. Puoi modificarle con i tuoi valori.

  6. Configura la regola di forwarding:

    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 la risorsa google_compute_global_forwarding_rule con il nome di destinazione myservice-https-proxy e collega il proxy HTTPS di destinazione creato in precedenza (myservice-https-proxy) e la risorsa indirizzo IP (myservice-service-ip). Puoi modificarli con i tuoi valori.

  7. Applica questa configurazione:

    Per applicare la configurazione di Terraform in un progetto Google Cloud , completa i passaggi nelle sezioni seguenti.

    Prepara Cloud Shell

    1. Avvia Cloud Shell.
    2. Imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform.

      Devi eseguire questo comando una sola volta per progetto e puoi eseguirlo in qualsiasi directory.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.

    Prepara la directory

    Ogni file di configurazione di Terraform deve avere la propria directory (chiamata anche modulo radice).

    1. In Cloud Shell, crea una directory e un nuovo file al suo interno. Il nome file deve avere l'estensione .tf, ad esempio main.tf. In questo tutorial, il file viene denominato main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se stai seguendo un tutorial, puoi copiare il codice campione in ogni sezione o passaggio.

      Copia il codice campione nel file main.tf appena creato.

      (Facoltativo) Copia il codice da GitHub. Questa operazione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.

    3. Rivedi e modifica i parametri di esempio da applicare al tuo ambiente.
    4. Salva le modifiche.
    5. Inizializza Terraform. Devi effettuare questa operazione una sola volta per directory.
      terraform init

      (Facoltativo) Per utilizzare l'ultima versione del provider Google, includi l'opzione -upgrade:

      terraform init -upgrade

    Applica le modifiche

    1. Rivedi la configurazione e verifica che le risorse che Terraform creerà o aggiornerà corrispondano alle tue aspettative:
      terraform plan

      Apporta le correzioni necessarie alla configurazione.

    2. Applica la configurazione di Terraform eseguendo il comando seguente e inserendo yes al prompt:
      terraform apply

      Attendi che Terraform visualizzi il messaggio "Apply complete!" (Applicazione completata).

    3. Apri il tuo Google Cloud progetto per visualizzare i risultati. Nella console Google Cloud , vai alle risorse nell'interfaccia utente per assicurarti che Terraform le abbia create o aggiornate.

Configura i gruppi di endpoint di rete regionali

Per ogni regione in cui hai eseguito il deployment nel passaggio precedente, devi creare gruppi di endpoint di rete (NEG) serverless e aggiungerli al servizio di backend utilizzando le seguenti istruzioni:

Interfaccia a riga di comando gcloud

  1. Crea un gruppo di endpoint di rete per il servizio Cloud Run in REGION:

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

    Sostituisci quanto segue:

    • NEG_NAME con il nome della risorsa del gruppo di endpoint di rete. (ad es. `myservice-neg-uscentral1`)
    • REGION con la regione in cui è stato eseguito il deployment del servizio.
    • SERVICE_NAME con il nome del tuo servizio.
  2. Aggiungi il gruppo di endpoint di rete al servizio di backend:

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

    Specifica il NEG_NAME creato nel passaggio precedente per la regione.

  3. Ripeti i passaggi precedenti per ogni regione.

Terraform

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

  1. Configura un gruppo di endpoint di rete con il nome myservice-neg per il servizio Cloud Run per ogni regione specificata nella variabile 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 servizio di backend per collegare il gruppo di endpoint di rete (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,
      ]
    }

Configurare i record DNS sul tuo dominio

Per indirizzare il tuo nome di dominio alla regola di forwarding che hai creato, aggiorna i relativi record DNS con l'indirizzo IP che hai creato.

  1. Trova l'indirizzo IP riservato del bilanciatore del carico eseguendo questo comando:

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

    Sostituisci SERVICE_IP con il nome dell'indirizzo IP che hai creato in precedenza. Questo comando stampa l'indirizzo IP nell'output.

  2. Aggiorna i record DNS del tuo dominio aggiungendo un record A con questo indirizzo IP.

Configurare il segmento di pubblico personalizzato se utilizzi servizi autenticati

I servizi autenticati sono protetti da IAM. Questi servizi Cloud Run richiedono l'autenticazione del client che dichiara il destinatario previsto di una richiesta al momento della generazione delle credenziali (il pubblico).

Il pubblico è in genere l'URL completo del servizio di destinazione, che per impostazione predefinita per i servizi Cloud Run è un URL generato che termina con run.app. Tuttavia, in un deployment multiregionale, un client non può sapere in anticipo a quale servizio regionale verrà indirizzata una richiesta. Pertanto, per un deployment multiregionale, configura il servizio in modo che utilizzi segmenti di pubblico personalizzati.

Attendi il provisioning del bilanciatore del carico

Dopo aver configurato il dominio con l'indirizzo IP del bilanciatore del carico, attendi la propagazione dei record DNS. Allo stesso modo, attendi che il certificato TLS gestito venga emesso per il tuo dominio e sia pronto per iniziare a gestire il traffico HTTPS a livello globale.

Potrebbero essere necessari fino a 30 minuti prima che il bilanciatore del carico inizi a gestire il traffico.

Quando è pronto, visita l'URL del tuo sito web con il prefisso https:// per provarlo.

Verifica stato

  1. Per controllare lo stato della propagazione del record DNS, utilizza l'utilità da riga di comando dig:

    dig A +short example.com

    L'output mostra l'indirizzo IP che hai configurato nei record DNS.

  2. Controlla lo stato dell'emissione del certificato gestito eseguendo questo comando:

    gcloud compute ssl-certificates describe CERT_NAME

    Sostituisci CERT_NAME con il nome scelto in precedenza per la risorsa del certificato SSL.

    L'output mostra una riga contenente status: ACTIVE.

Configurazione del reindirizzamento da HTTP a HTTPS

Per impostazione predefinita, una regola di forwarding gestisce un solo protocollo e pertanto le richieste ai tuoi endpoint http:// rispondono con "404 Not Found". Se devi reindirizzare le richieste ai tuoi URL http:// al protocollo https://, crea una mappa URL e una regola di forwarding aggiuntive seguendo queste istruzioni:

Interfaccia a riga di comando gcloud

  1. Crea una mappa URL con una regola di reindirizzamento.

    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

    Sostituisci HTTP_URLMAP_NAME con il nome della risorsa della mappa URL che creerai (ad esempio, myservice-httpredirect).

  2. Crea un proxy HTTP di destinazione con la mappa URL.

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

    Sostituisci HTTP_PROXY_NAME con il nome del proxy HTTP di destinazione che creerai (ad esempio, myservice-http).

  3. Crea una regola di forwarding sulla porta 80 con lo stesso indirizzo IP riservato.

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

    Sostituisci HTTP_FORWARDING_RULE_NAME con il nome della nuova regola di forwarding che creerai (ad esempio, myservice-httplb).

Terraform

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

  1. Crea una risorsa mappa URL con una regola di reindirizzamento:

    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 di destinazione con la risorsa mappa URL appena creata (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 regola di forwarding sulla porta 80 con la stessa risorsa di indirizzo IP riservato (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]
    }

Utilizzare le sottoscrizioni push Pub/Sub autenticate con il deployment multiregionale

Per impostazione predefinita, un servizio Pub/Sub invia i messaggi agli endpoint push nella stessa Google Cloud regione in cui il servizio Pub/Sub archivia i messaggi. Per una soluzione alternativa a questo comportamento, consulta Utilizzo di una sottoscrizione push Pub/Sub autenticata con un deployment Cloud Run multiregionale.

Configura un failover manuale

Per configurare manualmente il failover del traffico in una regione integra, modifica la mappa URL del bilanciatore del carico delle applicazioni esterno globale.

  1. Per aggiornare la mappa URL del bilanciatore del carico delle applicazioni esterno globale, rimuovi il NEG dal servizio di backend utilizzando il flag --global:

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

    Sostituisci quanto segue:

    • BACKEND_NAME: il nome del servizio di backend.
    • NEG_NAME: il nome della risorsa del gruppo di endpoint di rete, ad esempio myservice-neg-uscentral1.
    • REGION: la regione in cui è stato creato il NEG e da cui vuoi rimuovere il servizio. Ad esempio, europe-west1,asia-east1.
  2. Per verificare che una regione integra stia ora gestendo il traffico, vai su https://<domain-name>.