Gestisci il traffico da più regioni

Puoi fornire risposte più rapide ai tuoi utenti in tutto il mondo eseguendo il deployment di servizi in più regioni e indirizzandoli 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 implementati 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 multiregione da un singolo comando gcloud CLI o da un file YAML.

gcloud

  • Per creare ed eseguire il deployment di un servizio multi-regione, 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 multiregione che vuoi implementare.
    • IMAGE_URL: un riferimento all'immagine del contenitore, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest.
    • REGIONS: l'elenco di più regioni in cui eseguire il deployment. Ad esempio, us-central1,asia-east1.

YAML

  1. Crea il file YAML per il servizio utilizzando l'attributo run.googleapis.com/regions per impostare le più regioni in cui 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 multiregione in cui vuoi eseguire il deployment.
    • REGIONS: l'elenco di più regioni che vuoi aggiornare. Ad esempio, us-central1,asia-east1.
    • IMAGE_URL: un riferimento all'immagine del contenitore, 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

Aggiornare un servizio multiregionale

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

gcloud

Per aggiungere o rimuovere regioni da un servizio multiregione, 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 multiregione che vuoi aggiornare.
    • REGIONS: la regione o le regioni a cui vuoi aggiungere o rimuovere il servizio. Ad esempio, us-central1,asia-east1.

YAML

  1. Per aggiornare un servizio multi-regione 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 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

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del servizio multiregione in cui vuoi eseguire il deployment.
    • REGIONS: il nuovo elenco di più regioni in cui vuoi eseguire il deployment della revisione del servizio.
  3. Aggiorna il servizio utilizzando il seguente comando:

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

Eliminare un servizio multiregionale

  • Per eliminare un servizio multiregione, 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 multiregione 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 rimanda a un indirizzo IP anycast globale, che indirizza gli utenti al data center Google più vicino in cui è eseguito il deployment del servizio.

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

Crea un bilanciatore del carico

La creazione di un bilanciatore del carico esterno prevede la creazione di diverse risorse di rete e il loro collegamento:

Interfaccia a riga di comando gcloud

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

    Questo indirizzo IP è un indirizzo IPv4 anycast globale che indirizza al datacenter o al punto di presenza di 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 il 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 il nome che vuoi assegnare alla mappa di 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 tuo nome di 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 regola di inoltro 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.

Aggiungi quanto segue al tuo file Terraform (ad esempio main.tf):

  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 su myservice-service-ip. Puoi sostituirlo con il tuo valore. Questo indirizzo IP è un indirizzo IPv4 anycast globale che indirizza al data center o al punto di presenza di 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 con il nome myservice-backend. Puoi sostituirlo con il tuo valore.

  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 mappa di URL (myservice-lb-urlmap). Puoi sostituirli 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 target myservice-https-proxy e connette il certificato TLS (myservice-ssl-cert) e le risorse di mappatura degli URL (myservice-lb-urlmap) creati in precedenza. Puoi sostituirli 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 target del proxy HTTPS (myservice-https-proxy) e la risorsa indirizzo IP (myservice-service-ip) creati in precedenza. Puoi sostituirli con i tuoi valori.

  7. Applica questa configurazione:

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

    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 farlo 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 una propria directory (chiamata anche modulo principale).

    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 è 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 main.tf appena creato.

      Se vuoi, copia il codice da GitHub. Questa opzione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.

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

      Se vuoi, per utilizzare la versione più recente del provider Google, includi l'opzione -upgrade:

      terraform init -upgrade

    Applica le modifiche

    1. Rivedi la configurazione e verifica che le risorse che Terraform sta per creare o aggiornare corrispondano alle tue aspettative:
      terraform plan

      Apporta le correzioni necessarie alla configurazione.

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

      Attendi che Terraform mostri il messaggio "Applicazione completata".

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

Configurare i gruppi di endpoint di rete a livello di regione

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 [region][loc] in cui è stato eseguito il deployment del servizio.
    • SERVICE_NAME con il nome del 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

  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,
      ]
    }

Configura 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 il seguente comando:

    gcloud compute addresses describe \
      --global SERVICE_IP \
      --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.

Configura 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 segmento di 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 multi-regione, un client non può sapere in anticipo a quale servizio regionale verrà indirizzata una richiesta. Pertanto, per un deployment multi-regione, configura il servizio in modo da utilizzare 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. Analogamente, attendi che il certificato TLS gestito venga emesso per il tuo dominio e che sia tutto 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 è tutto pronto, visita l'URL del tuo sito web con il prefisso https:// per provarlo.

Verifica stato

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

    dig A +short example.com

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

  2. Controlla lo stato dell'emissione dei certificati gestiti eseguendo il seguente 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, di conseguenza, le richieste ai tuoi endpoint http:// rispondono con "404 Not Found". Se devi reindirizzare le richieste ai tuoi URL http:// al protocollo https://, crea un'altra mappa URL e una regola di forwarding seguendo le istruzioni riportate di seguito:

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 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

  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 di 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 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 gli abbonamenti push Pub/Sub autenticati con il deployment multiregione

Per impostazione predefinita, un servizio Pub/Sub invia i messaggi agli endpoint push nella stessa regione Google Cloud 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 multiregione.