Modelli di istanza deterministici

Questa pagina descrive quando e perché creare modelli di istanza deterministici. I modelli di istanza deterministici chiariscono esplicitamente il tipo di app o servizi di terze parti da installare nelle istanze quando viene eseguito il deployment del modello di istanza. La creazione di modelli di istanza deterministici riduce al minimo l'ambiguità e il comportamento imprevisto dei modelli di istanza.

Perché creare modelli di istanza deterministici

In generale, consigliamo che le proprietà del modello di istanza siano il più esplicite e deterministiche possibile. Se nei tuoi modelli di istanza utilizzi script di avvio che installano o utilizzano servizi di terze parti, assicurati che questi script forniscano informazioni esplicite, ad esempio la versione dell'app da installare. Compute Engine può basarsi solo sulle informazioni definite nel modello e non ha alcun controllo sui servizi di terze parti a cui viene fatto riferimento. Se il modello è troppo vago, potrebbe comportarsi in modo imprevisto.

Ad esempio, considera il seguente comando per creare un modello di istanza con uno script di avvio che installa apache2 e utilizza un file ospitato su un server esterno:

gcloud compute instance-templates create example-template-with-startup \
    --image-family debian-9 \
    --image-project debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt install -y apache2
    scp myuser@108.59.87.185:index.php /var/www/'

Esistono due potenziali problemi con questo script di avvio:

  • Lo script non definisce in modo esplicito quale versione di apache2 installare e si basa sulla versione corrente disponibile nel repository apt.
  • Lo script si basa su un file ospitato su una terza parte che non è sottoposto al controllo delle versioni e potrebbe essere stato modificato dall'ultima volta in cui è stato utilizzato il modello di istanza.

Se utilizzi un gestore della scalabilità automatica, un modello di istanza non deterministico può far sì che il gestore della scalabilità automatica aggiunga nuove istanze a un gruppo di istanze gestite con una configurazione diversa, ad esempio una versione di apache2 diversa.

Allo stesso modo, se hai applicato questo modello a un gruppo di istanze gestite, hai aggiornato il gruppo a un servizio di modello diverso e poi hai deciso di eseguire il rollback al modello precedente, potresti ritrovarti con istanze che usano una versione del file apache2 o index.php diversa rispetto a prima dell'aggiornamento, perché all'avvio le istanze recuperavano sempre la versione più recente.

Evitare comportamenti ambigui o imprevisti dei modelli di istanza

Per evitare comportamenti imprevisti del modello, utilizza uno dei seguenti metodi:

  • Usa immagini ottimizzate per il container o Docker con i tag Docker. Ad esempio, ti consigliamo di assegnare nuovi tag per ogni nuova build della tua immagine Docker e di utilizzare questi tag nei tuoi modelli di istanza anziché nel tag predefinito più recente. Per un'immagine ottimizzata per i container, puoi fare riferimento esplicito a una determinata build dell'immagine nel file manifest. L'esempio seguente utilizza l'immagine Docker "myimage" nella versione con tag "version_2_1_3":

    version: v1beta2
    containers:
      - name: simple-echo
        image: myimage:version_2_1_3
           [ rest of your manifest file ]
    
  • Crea un'immagine personalizzata da utilizzare come immagine per il modello. È preferibile utilizzare gli script di avvio perché garantisce che ogni istanza sia la stessa. Gli script di avvio potrebbero avere risultati diversi dopo l'aggiornamento del pacchetto di distribuzione. Utilizza gli script di avvio nei tuoi modelli di istanza per la prototipazione e lo sviluppo rapido e utilizza le immagini personalizzate quando è tutto pronto per eseguire il deployment di servizi di qualità produttiva.

  • Se utilizzi gli script di avvio, valuta la possibilità di aggiornarli in modo che siano deterministici. Ad esempio, crea una nuova versione del modello precedente e specifica uno script di avvio deterministico come segue:

    gcloud compute instance-templates create example-template-with-startup-2-1-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --metadata startup-script='#! /bin/bash
        sudo apt install -y apache2=2.2.20-1ubuntu1
        scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
    

    dove "version_2_1_3" è una sottodirectory contenente gli script PHP per la versione 2.1.3 del tuo servizio.

Passaggi successivi