Questa pagina descrive quando e perché creare template di istanza deterministici. I template di istanza deterministici chiariscono esplicitamente il tipo di app o servizi di terze parti da installare sulle istanze al momento del deployment del template di istanza. Creando template di istanza deterministici, riduci al minimo l'ambiguità e i comportamenti imprevisti dei template di istanza.
Perché creare template di istanza deterministici
In generale, consigliamo che le proprietà del template di istanza siano il più esplicite e deterministiche possibile. Se utilizzi script di avvio nei template di istanza 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ò fare affidamento solo sulle informazioni definite nel template e non ha alcun controllo sui servizi di terze parti a cui si fa riferimento. Se il template è troppo vago, il template di istanza potrebbe comportarsi in modo imprevisto.
Ad esempio, considera il seguente comando per creare un template 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 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 delle versioni e potrebbe essere stato modificato dall'ultima volta che è stato utilizzato il template di istanza.
Se utilizzi un gestore della scalabilità automatica, un template di istanza non deterministico può causare l'aggiunta da parte del gestore della scalabilità automatica 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 template a un gruppo di istanze gestite, hai aggiornato il gruppo con un servizio di template diverso e poi hai deciso di eseguire il rollback al template precedente, potresti ritrovarti con istanze che utilizzano una versione diversa di apache2 o del file index.php rispetto a prima dell'aggiornamento perché le istanze recupereranno sempre la versione più recente all'avvio.
Evitare comportamenti ambigui o imprevisti dei template di istanza
Per evitare comportamenti imprevisti del template, 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 build dell'immagine Docker e di utilizzarli nei template di istanza al posto del 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 template. 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 template 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à elevata.
Se utilizzi script di avvio, valuta la possibilità di aggiornarli in modo che siano deterministici. Ad esempio, crea una nuova versione del template 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 che contiene script PHP per la versione 2.1.3 del servizio.