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 sulle tue istanze quando il modello di istanza viene implementato. Creando modelli di istanze deterministici, riduci al minimo l'ambiguità e i comportamenti imprevisti dei modelli di istanze.
Perché creare modelli di istanza deterministici
In generale, consigliamo di impostare le proprietà del modello di istanza in modo che siano il più esplicite e deterministiche possibile. Se utilizzi script di avvio nei modelli di istanze che installano o utilizzano servizi di terze parti, assicurati che forniscano informazioni esplicite, ad esempio la versione dell'app da installare. Compute Engine può fare affidamento 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, il modello di istanza potrebbe comportarsi in modo imprevisto.
Ad esempio, considera il seguente comando per creare un modello di istanza con un 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 esplicitamente 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 a controllo della versione e potrebbe essere stato modificato dall'ultima volta che è stato utilizzato il modello di istanza.
Se utilizzi un gestore della scalabilità automatica, un modello di istanza non deterministico può causare l'aggiunta di nuove istanze a un gruppo di istanze gestite con una configurazione diversa, ad esempio una versione diversa di apache2.
Analogamente, se hai applicato questo modello a un gruppo di istanze gestite, hai aggiornato il gruppo con un modello diverso e poi hai deciso di eseguire il rollback al modello precedente, potresti ritrovarti con istanze che utilizzano una versione diversa del file apache2 o index.php rispetto a prima dell'aggiornamento perché le istanze recupereranno sempre la versione più recente all'avvio.
Evitare comportamenti ambigui o imprevisti dei modelli di istanze
Per evitare comportamenti imprevisti del modello, utilizza uno dei seguenti metodi:
Utilizza immagini ottimizzate per i container o Docker con i tag Docker. Ad esempio, ti consigliamo di assegnare nuovi tag per ogni nuova compilazione dell'immagine Docker e di utilizzarli nei modelli di istanze anziché nel tag più recente predefinito. Per un'immagine ottimizzata per i container, puoi fare riferimento esplicitamente 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. Questa soluzione è preferibile agli script di avvio perché garantisce che ogni istanza sia uguale. Gli script di avvio potrebbero avere risultati diversi dopo gli aggiornamenti del pacchetto di distribuzione. Utilizza gli script di avvio nei modelli di istanze per la prototipazione e lo sviluppo rapido e utilizza le immagini personalizzate quando è tutto pronto per il deployment di servizi di qualità di produzione.
Se utilizzi script di avvio, ti consigliamo 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 script PHP per la versione 2.1.3 del servizio.