Utilizzo della riparazione automatica per app ad alta affidabilità


Questo tutorial interattivo mostra come utilizzare la riparazione automatica per creare app ad alta affidabilità su Compute Engine.

Le app ad alta affidabilità sono progettate per soddisfare le richieste dei client con latenza e tempi di inattività minimi. L'affidabilità è compromessa quando un'app si arresta in modo anomalo o si blocca. I client di un'app compromessa possono riscontrare latenza elevata o tempi di inattività.

La riparazione automatica ti consente di riavviare automaticamente le app compromesse. Rileva tempestivamente le istanze di macchine virtuali (VM) con errori e le ricrea automaticamente, in modo da tornare a soddisfare le richieste dei client. Con la riparazione automatica, non è più necessario rimettere un'app in servizio manualmente dopo un errore.

Obiettivi

  • Configurare un controllo di integrità e una policy di riparazione automatica.
  • Configurare un servizio web demo su un gruppo di istanze gestite (MIG).
  • Simulare gli errori dei controlli di integrità e osservare il processo di ripristino della riparazione automatica.

Costi

Questo tutorial utilizza componenti fatturabili di Google Cloud , tra cui:

  • Compute Engine

Prima di iniziare

    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.

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

    Make sure that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Enable the API

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

    Make sure that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Enable the API

Se preferisci lavorare dalla riga di comando, installa Google Cloud CLI.

Architettura dell'app

L'app include i seguenti componenti di Compute Engine:

  • Controllo di integrità: una policy di controllo di integrità HTTP utilizzata dal gestore della riparazione automatica per rilevare le VM con errori.
  • Regole firewall: le regole firewall diGoogle Cloud ti permettono di consentire o rifiutare il traffico alle tue VM.
  • Gruppo di istanze gestite: un gruppo di VM che eseguono lo stesso servizio web demo.
  • Modello di istanza: un modello utilizzato per creare ogni VM nel gruppo di istanze.

Architettura di sistema per un controllo di integrità e un gruppo di istanze.

Test del controllo di integrità sul servizio web demo

Un controllo di integrità invia richieste di probe a una VM utilizzando un protocollo specificato, come HTTP(S), SSL o TCP. Per saperne di più, consulta Come funzionano i controlli di integrità e Protocolli, porte e categorie per il controllo di integrità.

Il controllo di integrità in questo tutorial è un controllo di integrità HTTP che testa il percorso HTTP /health sulla porta 80. Per un controllo di integrità HTTP, la richiesta di probe viene passata solo se il percorso restituisce una risposta HTTP 200 (OK). Per questo tutorial, il server web demo definisce il percorso /health per restituire una risposta HTTP 200 (OK) quando lo stato è integro o una risposta HTTP 500 (Internal Server Error) in caso contrario. Per saperne di più, consulta Criteri di esito positivo per HTTP, HTTPS e HTTP/2.

Crea il controllo di integrità

Per configurare la riparazione automatica, crea un controllo di integrità personalizzato e configura il firewall di rete per consentire i probe del controllo di integrità.

In questo tutorial creerai un controllo di integrità a livello di regione. Per la riparazione automatica, puoi utilizzare un controllo di integrità a livello di regione o globale. I controlli di integrità a livello di regione riducono le dipendenze tra regioni e contribuiscono a garantire la residenza dei dati. I controlli di integrità globali sono utili se vuoi utilizzare lo stesso controllo di integrità per i MIG in più regioni.

Console

  1. Crea un controllo di integrità.

    1. Nella console Google Cloud , vai alla pagina Crea un controllo di integrità.

      Vai a Crea un controllo di integrità

    2. Nel campo Nome, inserisci autohealer-check.

    3. Imposta Ambito su Regional.

    4. Nel menu a discesa Regione, seleziona europe-west1.

    5. In Protocollo, seleziona HTTP.

    6. Imposta Percorso richiesta su /health. Indica il percorso HTTP utilizzato dal controllo di integrità. Per questo tutorial, il server web demo definisce il percorso /health per restituire una risposta HTTP 200 (OK) quando lo stato è integro o una risposta HTTP 500 (Internal Server Error) in caso contrario.

    7. Imposta i Criteri integrità:

      1. Imposta Intervallo di controllo su 10. Questa impostazione definisce il tempo dall'inizio di un probe all'inizio del successivo.
      2. Imposta Timeout su 5. Questa impostazione definisce il tempo di attesa da parte diGoogle Cloud per una risposta a un probe. Questo valore deve essere inferiore o uguale all'intervallo di controllo.
      3. Imposta Soglia stato integro su 2. Questa impostazione definisce il numero di probe sequenziali che devono riuscire affinché la VM sia considerata in stato integro.
      4. Imposta Soglia stato non integro su 3. Questa impostazione definisce il numero di probe sequenziali che non devono riuscire affinché la VM sia considerata in stato non integro.
    8. Lascia i valori predefiniti per le altre opzioni.

    9. Fai clic su Crea in basso.

  2. Crea una regola firewall per consentire ai probe del controllo di integrità di effettuare richieste HTTP.

    1. Nella console Google Cloud , vai alla pagina Crea regola firewall.

      Vai a Crea regola firewall

    2. In Nome, inserisci default-allow-http-health-check.

    3. In Rete, seleziona default.

    4. In Destinazioni, seleziona All instances in the network.

    5. In Filtro di origine, seleziona IPv4 ranges.

    6. In Intervalli IPv4 di origine, inserisci 130.211.0.0/22, 35.191.0.0/16.

    7. In Protocolli e porte, seleziona TCP e inserisci 80.

    8. Lascia i valori predefiniti per le altre opzioni.

    9. Fai clic su Crea.

gcloud

  1. Crea un controllo di integrità utilizzando il comando health-checks create http.

    gcloud compute health-checks create http autohealer-check \
        --region europe-west1 \
        --check-interval 10 \
        --timeout 5 \
        --healthy-threshold 2 \
        --unhealthy-threshold 3 \
        --request-path "/health"
    
    • check-interval definisce l'intervallo di tempo dall'inizio di un probe all'inizio di quello successivo.
    • timeout definisce il tempo di attesa da parte di Google Cloudper una risposta a un probe. Questo valore deve essere inferiore o uguale all'intervallo di controllo.
    • healthy-threshold definisce il numero di probe sequenziali che devono riuscire affinché la VM sia considerata in stato integro.
    • unhealthy-threshold definisce il numero di probe sequenziali che non devono riuscire affinché la VM sia considerata in stato non integro.
    • request-path indica il percorso HTTP utilizzato dal controllo di integrità. Per questo tutorial, il server web demo definisce il percorso /health per restituire una risposta HTTP 200 (OK) quando lo stato è integro o una risposta HTTP 500 (Internal Server Error) in caso contrario.
  2. Crea una regola firewall per consentire ai probe del controllo di integrità di effettuare richieste HTTP.

    gcloud compute firewall-rules create default-allow-http-health-check \
        --network default \
        --allow tcp:80 \
        --source-ranges 130.211.0.0/22,35.191.0.0/16
    

Caratteristiche di un buon controllo di integrità con riparazione automatica

I controlli di integrità utilizzati per la riparazione automatica devono essere prudenti, in modo da non eliminare e ricreare le istanze quando non è necessario. Quando un controllo di integrità del gestore della riparazione automatica è troppo aggressivo, il gestore potrebbe scambiare le istanze occupate per istanze in errore e riavviarle inutilmente, riducendo la disponibilità.

  • unhealthy-threshold. Deve essere maggiore di 1. Idealmente, imposta questo valore almeno su 3. Questo assicura la protezione da errori rari come la perdita di pacchetti di rete.
  • healthy-threshold. Un valore di 2 è sufficiente per la maggior parte delle app.
  • timeout. Imposta un valore di tempo elevato (almeno cinque volte superiore al tempo di risposta previsto). Questo assicura la protezione da ritardi inaspettati, come istanze occupate o una connessione di rete lenta.
  • check-interval. Questo valore deve essere compreso tra 1 secondo e il doppio del timeout (non troppo lungo né troppo breve). Quando un valore è troppo lungo, un'istanza in errore non viene rilevata per tempo. Quando un valore è troppo breve, le istanze e la rete possono diventare congestionate a causa dell'elevato numero di probe del controllo di integrità inviati ogni secondo.

Configura il servizio web

Questo tutorial utilizza un'app web archiviata su GitHub. Per saperne di più sulle modalità di implementazione dell'app, vedi il repository GitHub GoogleCloudPlatform/python-docs-samples.

Per configurare il servizio web demo, crea un modello di istanza che avvia il server web demo all'avvio dell'istanza. Poi, utilizza questo modello di istanza per eseguire il deployment di un gruppo di istanze gestite e abilitare la riparazione automatica.

Console

  1. Crea un modello di istanza. Includi uno script di avvio che avvia il server web demo.

    1. Nella console Google Cloud , vai alla pagina Crea modello di istanza.

      Vai a Crea modello di istanza

    2. Imposta Nome su webserver-template.

    3. Nella sezione Località, seleziona europe-west1 dal menu a discesa Regione.

    4. Nella sezione Configurazione macchina, nel menu a discesa Tipo di macchina, seleziona e2-medium.

    5. Nella sezione Firewall, seleziona la casella di controllo Consenti traffico HTTP.

    6. Espandi la sezione Opzioni avanzate per visualizzare le impostazioni avanzate. Vengono visualizzate diverse sottosezioni.

    7. Nella sezione Gestione, individua Automazione e inserisci il seguente Script di avvio:

      apt update && apt -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo
      

    8. Lascia i valori predefiniti per le altre opzioni.

    9. Fai clic su Crea.

  2. Esegui il deployment del server web come gruppo di istanze gestite.

    1. Nella console Google Cloud , vai alla pagina Crea gruppo di istanze.

      Vai a Crea gruppo di istanze

    2. Imposta Nome su webserver-group.

    3. In Modello di istanza, seleziona webserver-template.

    4. In Regione, seleziona europe-west1.

    5. In Zona, seleziona europe-west1-b.

    6. Nella sezione Scalabilità automatica, per Modalità di scalabilità automatica, seleziona Off: non scalare automaticamente.

    7. Torna al campo Numero di istanze e impostalo su 3.

    8. Nella sezione Riparazione automatica, segui questi passaggi:

      1. Nel menu a discesa Controllo di integrità, seleziona autohealer-check.
      2. Imposta Ritardo iniziale su 180.

    9. Lascia i valori predefiniti per le altre opzioni.

    10. Fai clic su Crea.

  3. Crea una regola firewall che consenta le richieste HTTP ai server web.

    1. Nella console Google Cloud , vai alla pagina Crea regola firewall.

      Vai a Crea regola firewall

    2. In Nome, inserisci default-allow-http.

    3. In Rete, seleziona default.

    4. In Destinazioni, seleziona Specified target tags.

    5. In Tag di destinazione, inserisci http-server.

    6. In Filtro di origine, seleziona IPv4 ranges.

    7. In Intervalli IPv4 di origine, inserisci 0.0.0.0/0 per consentire l'accesso a tutti gli indirizzi IP.

    8. In Protocolli e porte, seleziona TCP e inserisci 80.

    9. Lascia i valori predefiniti per le altre opzioni.

    10. Fai clic su Crea.

gcloud

  1. Crea un modello di istanza. Includi uno script di avvio che avvia il server web demo.

    gcloud compute instance-templates create webserver-template \
        --instance-template-region europe-west1 \
        --machine-type e2-medium \
        --tags http-server \
        --metadata startup-script='
      apt update && apt -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo'
    
  2. Crea un gruppo di istanze gestite.

    gcloud compute instance-groups managed create webserver-group \
        --zone europe-west1-b \
        --template projects/PROJECT_ID/regions/europe-west1/instanceTemplates/webserver-template \
        --size 3 \
        --health-check projects/PROJECT_ID/regions/europe-west1/healthChecks/autohealer-check \
        --initial-delay 180
    
  3. Crea una regola firewall che consenta le richieste HTTP ai server web.

    gcloud compute firewall-rules create default-allow-http \
        --network default \
        --allow tcp:80 \
        --target-tags http-server
    

Attendi qualche minuto mentre il gruppo di istanze gestite crea e verifica le VM.

Simula errori del controllo di integrità

Per simulare errori del controllo di integrità, il server web demo offre dei modi per forzare un errore.

Console

  1. Vai a una VM del server web.

    1. Nella console Google Cloud , vai alla pagina Istanze VM.

      Vai a Istanze VM

    2. Fai clic sull'indirizzo IP nella colonna IP esterno di una qualsiasi VM webserver-group. Si aprirà una nuova scheda nel browser web. Se la richiesta scade o la pagina web non è disponibile, attendi un minuto per consentire al server di completare la configurazione e riprova.

    Il server web demo mostra una pagina simile alla seguente:

    Pagina web demo che mostra pulsanti di stato verdi e pulsanti di azione blu.

  2. Nella pagina web demo, fai clic su Rendi non integra.

    In questo modo, il server web non supererà il controllo di integrità. Nello specifico, il server web fa sì che il percorso /health restituisca HTTP 500 (Internal Server Error). Puoi verificarlo facendo clic rapidamente sul pulsante Verifica integrità (questo pulsante smette di funzionare dopo che il gestore della riparazione automatica ha iniziato a riavviare la VM).

  3. Attendi che il gestore della riparazione automatica intervenga.

    1. Nella console Google Cloud , vai alla pagina Istanze VM.

      Vai a Istanze VM

    2. Attendi che lo stato della VM del server web cambi. Il segno di spunta verde accanto al nome della VM dovrebbe diventare un quadrato grigio, a indicare che il gestore della riparazione automatica ha iniziato a riavviare la VM in stato non integro.

    3. Fai clic su Aggiorna nella parte superiore della pagina periodicamente per ricevere lo stato più recente.

    4. Il processo di riparazione automatica è completo quando il quadrato grigio torna a essere un segno di spunta verde, a indicare che la VM è di nuovo in stato integro.

gcloud

  1. Monitora lo stato del gruppo di istanze gestite. Al termine, interrompi premendo Ctrl+C.

    while : ; do
      gcloud compute instance-groups managed list-instances webserver-group \
      --zone europe-west1-b
      sleep 5  # Wait for 5 seconds
    done
    
      NAME: webserver-group-0zx6
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    
      NAME: webserver-group-4qbx
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    
      NAME: webserver-group-m5v5
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    

    Tutte le VM del gruppo devono mostrare STATUS: RUNNING e ACTION: NONE. In caso contrario, attendi qualche minuto per consentire il completamento della configurazione delle VM e riprova.

  2. Apri una nuova sessione Cloud Shell con Google Cloud CLI installato.

  3. Ottieni l'indirizzo di una VM del server web.

    gcloud compute instances list --filter webserver-group
    

    Nella colonna EXTERNAL_IP, copia l'indirizzo IP di qualsiasi VM del server web e salvalo come variabile bash locale.

    export IP_ADDRESS=EXTERNAL_IP_ADDRESS
    
  4. Verifica che la configurazione del server web sia stata completata. Il server restituisce una risposta HTTP 200 OK.

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 200 OK
    Server: gunicorn
    ...
    

    Se ricevi un errore Connection refused, attendi un minuto per consentire al server di completare la configurazione e riprova.

  5. Rendi non integro il server web.

    curl $IP_ADDRESS/makeUnhealthy > /dev/null
    

    In questo modo, il server web non supererà il controllo di integrità. Nello specifico, il server web fa sì che il percorso /health restituisca HTTP 500 INTERNAL SERVER ERROR. Puoi verificarlo inviando rapidamente una richiesta a /health (questa operazione non funziona più dopo che il gestore della riparazione automatica ha iniziato a riavviare la VM).

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 500 INTERNAL SERVER ERROR
    Server: gunicorn
    ...
    
  6. Torna alla prima sessione shell per monitorare il gruppo di istanze gestite e attendi l'intervento del gestore della riparazione automatica.

    1. Quando viene avviato il processo di riparazione automatica, le colonne STATUS e ACTION si aggiornano, a indicare che il gestore della riparazione automatica ha iniziato a riavviare la VM in stato non integro.

        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: STOPPING
        HEALTH_STATE: UNHEALTHY
        ACTION: RECREATING
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        ...
      
    2. Il processo di riparazione automatica è concluso quando la VM segnala di nuovo STATUS come RUNNING e ACTION come NONE, a indicare che la VM è stata riavviata correttamente.

        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: RUNNING
        HEALTH_STATE: HEALTHY
        ACTION: NONE
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        ...
      
    3. Quando hai finito di monitorare il gruppo di istanze gestite, interrompi il monitoraggio facendo clic su Ctrl+C.

Non esitare a ripetere l'esercizio. Ecco alcune idee:

  • Cosa succede se rendi non integro lo stato di tutte le VM contemporaneamente? Per saperne di più sul comportamento della riparazione automatica durante gli errori simultanei, consulta Comportamento della riparazione automatica.

  • Puoi aggiornare la configurazione del controllo di integrità affinché ripari le VM il più rapidamente possibile? (Nella pratica, devi impostare i parametri del controllo di integrità in modo che utilizzino valori conservativi, come spiegato in questo tutorial. In caso contrario, potresti rischiare di eliminare e riavviare per errore le VM quando non c'è alcun problema reale).

  • Il gruppo di istanze gestite ha un'impostazione di configurazione initial delay. Puoi determinare il ritardo minimo necessario per questo server web demo? (Nella pratica, devi impostare il ritardo su un valore leggermente superiore (del 10-20%) rispetto al tempo necessario a una VM per avviarsi e iniziare a gestire le richieste delle app. In caso contrario, la VM potrebbe bloccarsi in un loop di avvio della riparazione automatica).

(Facoltativo) Visualizza la cronologia del gestore della riparazione automatica

Per visualizzare una cronologia delle operazioni del gestore della riparazione automatica, utilizza il seguente comando gcloud:

gcloud compute operations list --filter='operationType~compute.instances.repair.*'

Per saperne di più, consulta Visualizzazione della cronologia delle operazioni di riparazione automatica.

Esegui la pulizia

Al termine del tutorial, puoi eliminare le risorse che hai creato in modo che smettano di utilizzare la quota e di generare addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.

Se hai creato un progetto separato per questo tutorial, elimina l'intero progetto. In caso contrario, se il progetto contiene risorse che vuoi conservare, elimina solo le risorse specifiche create in questo tutorial.

Eliminazione del progetto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Eliminazione di risorse specifiche

Se non riesci a eliminare il progetto utilizzato per questo tutorial, elimina le risorse del tutorial singolarmente.

Eliminazione del gruppo di istanze

console

  1. In the Google Cloud console, go to the Instance groups page.

    Go to Instance groups

  2. Select the checkbox for your webserver-group instance group.
  3. To delete the instance group, click Delete.

gcloud

gcloud compute instance-groups managed delete webserver-group --zone europe-west1-b -q

Eliminazione del modello di istanza

console

  1. Nella console Google Cloud , vai alla pagina Modelli di istanza.

    Vai a Modelli di istanza

  2. Fai clic sulla casella di controllo accanto al modello di istanza.

  3. Fai clic su Elimina nella parte superiore della pagina. Nella nuova finestra, fai clic su Elimina per confermare l'eliminazione.

gcloud

gcloud compute instance-templates delete webserver-template -q \
    --region=europe-west1

Eliminazione del controllo di integrità

console

  1. Nella console Google Cloud , vai alla pagina Controlli di integrità.

    Vai a Controlli di integrità

  2. Fai clic sulla casella di controllo accanto al controllo di integrità.

  3. Fai clic su Elimina nella parte superiore della pagina. Nella nuova finestra, fai clic su Elimina per confermare l'eliminazione.

gcloud

gcloud compute health-checks delete autohealer-check -q \
    --region=europe-west1

Eliminazione delle regole firewall

console

  1. Nella console Google Cloud , vai alla pagina Regole firewall.

    Vai a Regole firewall

  2. Fai clic sulle caselle di controllo accanto alle regole firewall denominate default-allow-http e default-allow-http-health-check.

  3. Fai clic su Elimina nella parte superiore della pagina. Nella nuova finestra, fai clic su Elimina per confermare l'eliminazione.

gcloud

gcloud compute firewall-rules delete default-allow-http default-allow-http-health-check -q

Passaggi successivi